Asp.Net Core MVC 案例系列二

阻止控制器中方法被公開為Action方法

??在控制器類中恢恼,默認(rèn)會(huì)將所有公共Action方法視為操作方法姻乓,但在某些特殊情況下砂碉,不希望被作為Action方法公開蕉拢。就需要在方法上加上NonAction特性禁止公開,也就不能通過URL訪問了特碳。

重命名Action方法

??MVC框架默認(rèn)指定Action方法名與成員方法名一致,但如果控制器類成員方法上應(yīng)用了ActionName特性并指定了另一個(gè)名稱晕换,那就是重命名了午乓,與Action方法相對(duì)應(yīng)的視圖文件也要使用指定的名稱。

  • 本例中闸准,Action名稱GetItems重命名為get-items益愈。
    public class HomeController : Controller
    {
        [ActionName("get-items")]
        public ActionResult GetItems()
        {
            return View();
        }
    }

使用布局頁

??布局頁可作為項(xiàng)目?jī)?nèi)各視圖母版,用于排版被重復(fù)使用的內(nèi)容夷家。
??在布局頁中蒸其,可在內(nèi)容頁出現(xiàn)位置用RenderBody方法來生成占位符,內(nèi)容頁HTML元素將會(huì)填滿库快。
??在內(nèi)容頁中摸袁,通過Layout屬性可以設(shè)置布局頁名稱。如果布局頁位于可被查找位置义屏,就不需要指定路徑和擴(kuò)展名靠汁,否則就要明確指定。
??一般在命名有特殊用途的視圖文件時(shí)都會(huì)以下劃線開頭湿蛔,所以布局頁通常命名為_Layout.cshtml膀曾。

??在View目錄下建Shared目錄,Shared目錄下添加布局頁_Layout.cshtml阳啥。

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <div style="height:100px; background-color:slateblue;position:relative">
        <p style="color:white;font-size:40px;position:absolute;margin-left:15px">
            清新小站
        </p>
    </div>
    <div style="margin-top:35px;margin-bottom:45px">
        @RenderBody()
    </div>
    <div>
        <hr/>
        ? 2018 - 2018 版權(quán)所有
    </div>
</body>
</html>

??在View目錄下建Test目錄添谊,Test目錄下添加布局頁Default.cshtml。

@{
    Layout = "_Layout";
}
<div>
    網(wǎng)站主頁
</div>

??添加控制器

    public class TestController : Controller
    {
        public ActionResult Default()
        {
            return View();
        }
    }

_ViewStart視圖與_ViewImports視圖

??_ViewStart視圖與_ViewImports視圖不用于定義可視化內(nèi)容察迟,而是用于聲明一些在視圖中重復(fù)使用的指令斩狱。

??_ViewImports視圖專門用于導(dǎo)入命名空間,System扎瓶、System.Threading.Tasks所踊、Microsoft.AspNetCore.Mvc等,這樣不需要每個(gè)視圖文件都寫一遍using指令概荷。

??_ViewStart視圖用來放置各個(gè)視圖中都可能重復(fù)使用的指令秕岛,例如引用頁_Layout,后面就不用重復(fù)寫了,在執(zhí)行每個(gè)視圖文件時(shí)都會(huì)先執(zhí)行_ViewStart視圖中的代碼。

??_ViewStart_ViewImports并不要求放置到/View/Shared目錄下继薛,它們可以放到任何存有視圖文件的目錄下修壕,只對(duì)當(dāng)前目錄及子目錄下的視圖起作用。

??定義Demo控制器遏考,對(duì)應(yīng)五個(gè)視圖慈鸠。

    public class DemoController : Controller
    {
        public ActionResult Index() => View();
        public ActionResult Desc() => View();
        public ActionResult News() => View();
        public ActionResult Products() => View();
        public ActionResult ContactUs() => View();
    }

??在View目錄下建Shared子目錄,并在Shared中存放_(tái)Layout灌具。
??nav標(biāo)簽所定義的導(dǎo)航欄包括指向五個(gè)視圖的鏈接青团,此處可使用 asp-controllerasp-action 兩個(gè)標(biāo)簽幫助器使框架自動(dòng)生成導(dǎo)航的URL。

@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <nav>
        <a asp-controller="Demo" asp-action="Index">主頁</a>
        <a asp-controller="Demo" asp-action="Desc">公司簡(jiǎn)介</a>
        <a asp-controller="Demo" asp-action="News">新聞</a>
        <a asp-controller="Demo" asp-action="Products">產(chǎn)品信息</a>
        <a asp-controller="Demo" asp-action="ContactUs">聯(lián)系我們</a>
    </nav>
    <div>
        @RenderBody()
    </div>
</body>
</html>

??在View目錄下建Demo子目錄對(duì)應(yīng)控制器咖楣,在建對(duì)應(yīng)的五個(gè)視圖(內(nèi)容為此形式<h3>主頁</h3>)督笆。

??在Demo目錄下添加 _ViewStart 視圖文件,導(dǎo)入可能會(huì)被用到的命名空間诱贿。

@{
    Layout = "_Layout";
}
@addTagHelper  *,Microsoft.AspNetCore.Mvc.TagHelpers

??在Demo目錄下添加 _ViewImports 視圖文件胖腾,寫入會(huì)被重復(fù)使用的代碼。

@using System
@using Microsoft.AspNetCore.Mvc
@using Microsoft.AspNetCore.Mvc.TagHelpers

在控制器中接收服務(wù)列表的注入

??服務(wù)類型有時(shí)使用“接口-實(shí)現(xiàn)類”的方式來開發(fā)瘪松,因此一個(gè)服務(wù)接口可能有多個(gè)實(shí)現(xiàn)類咸作。

    services.AddScoped<ITestService, MD5CrtTest>();
    services.AddScoped<ITestService, SHA256Test>();

??一種方法時(shí)以接口實(shí)現(xiàn)類依賴注入。

    public DemoController(MD5CrtTest svs1, SHA256Test svs2)
    {
        _svs1 = svs1;
        _svs2 = svs2;
    }

??另一種方法是用IEnumerable<T>接口一同依賴注入宵睦。

    public DemoController(IEnumerable<ITestService> svs)
    {
        _encoders = svs;
    }

使用IFormCollection組件來提取form表單數(shù)據(jù)

??可以通過<form>元素收集用戶輸入的內(nèi)容记罚,提交服務(wù)器后轉(zhuǎn)由指定控制器中的某個(gè)操作方法進(jìn)行處理。操作方法通過參數(shù)來接收所提交的表單數(shù)據(jù)壳嚎。

??操作方法將參數(shù)聲明為IFormCollection類型桐智,表單提交的會(huì)存放在IFormCollection實(shí)例中,其數(shù)據(jù)結(jié)構(gòu)類型字典烟馅。

??定義Demo控制器说庭。PostUp方法在客戶端提交后從form參數(shù)提取數(shù)據(jù)存到字典中,再把字典傳遞給Show視圖郑趁。

    public class DemoController : Controller
    {
        public ActionResult Default() => View();

        public ActionResult PostUp(IFormCollection form)
        {
            IDictionary<string, string> dic = new Dictionary<string, string>();
            foreach(string k in form.Keys)
            {
                string v = form[k];
                dic[k] = v;
            }
            return View("Show", dic);
        }
    }

??Default視圖刊驴。

<html>
<body>
    <table>
        <tr>
            <td><label for="city">城市:</label></td>
            <td><input type="text" name="city" form="form"/></td>
        </tr>
        <tr>
            <td> <label for="name">姓名:</label></td>
            <td><input name="name" type="text" form="form"/></td>
        </tr>
    </table>
    <form id="form" asp-controller="Demo" asp-action="PostUp">
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

??Show視圖顯示內(nèi)容。@model指令用于聲明該視圖接收的模型對(duì)象為字典類型寡润,隨后Model屬性可獲取字典的實(shí)例引用捆憎,并用foreach語句枚舉出子項(xiàng)中Key與Value值。

@model IDictionary<string, string>

<html>
    <body>
        <h3>你輸入的內(nèi)容</h3>
        @{
            foreach(var i in Model)
            {
                <p>@i.Key : @i.Value</p>
            }
        }
    </body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梭纹,一起剝皮案震驚了整個(gè)濱河市躲惰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌变抽,老刑警劉巖础拨,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮块,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡诡宗,警方通過查閱死者的電腦和手機(jī)雇锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僚焦,“玉大人,你說我怎么就攤上這事曙痘》急” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵边坤,是天一觀的道長(zhǎng)名扛。 經(jīng)常有香客問我,道長(zhǎng)茧痒,這世上最難降的妖魔是什么肮韧? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮旺订,結(jié)果婚禮上弄企,老公的妹妹穿的比我還像新娘。我一直安慰自己区拳,他們只是感情好拘领,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著樱调,像睡著了一般约素。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笆凌,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天圣猎,我揣著相機(jī)與錄音,去河邊找鬼乞而。 笑死送悔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爪模。 我是一名探鬼主播放祟,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呻右!你這毒婦竟也來了跪妥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤声滥,失蹤者是張志新(化名)和其女友劉穎眉撵,沒想到半個(gè)月后侦香,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽疟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年罐韩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污朽。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡散吵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟆肆,到底是詐尸還是另有隱情矾睦,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布炎功,位于F島的核電站枚冗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛇损。R本人自食惡果不足惜赁温,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淤齐。 院中可真熱鬧股囊,春花似錦、人聲如沸更啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锈死。三九已至贫堰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間待牵,已是汗流浹背其屏。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缨该,地道東北人偎行。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贰拿,于是被迫代替她去往敵國(guó)和親蛤袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容