由于之前在項目中也使用MVC進(jìn)行開發(fā)号阿,但是具體是那個版本就不是很清楚了,但是我覺得大體的思想是相同的揭蜒,只是版本高的在版本低的基礎(chǔ)上增加了一些更加方便操作的東西其监。下面是我學(xué)習(xí)ASP.NET MVC5高級編程(5)的一些知識筆記,有些簡單的操作沒有進(jìn)行記錄乾忱,一些知識點就使用思維導(dǎo)圖來寫出大體的知識架構(gòu)讥珍。
MVC5是完全Bin部署的,也就是說我們最后發(fā)布的時候只是將Bin文件下面的應(yīng)用程序的程序集發(fā)布就可以窄瘟,對于服務(wù)器來說只需要有.NET 4.5就可以進(jìn)行安裝了衷佃。
一條至理名言“約定優(yōu)于配置”
這是在使用MVC時經(jīng)常聽到的話,之前不懂是什么意思蹄葱,現(xiàn)在隨著編碼次數(shù)的增多纲酗,對于這句話也有了自己的理解,大體的意思就是說按照人家的之前的約定新蟆,不要隨意調(diào)整項目中的目錄觅赊,結(jié)構(gòu)。也對現(xiàn)在整個MVC項目的架構(gòu)都搭建好了琼稻,如果說需要調(diào)整那么可能是一個大的工程吮螺,我們需要對整個底層使用到的相關(guān)地方都需要做更改。現(xiàn)在的整個結(jié)構(gòu)有一個理念是“使應(yīng)用程序的關(guān)注點分離帕翻,讓開發(fā)人員更加方便的開發(fā)鸠补。”
MVC提供的是方法調(diào)用的結(jié)果嘀掸,不是動態(tài)生成頁面(腳本)紫岩。
在Web中使用MVC時,應(yīng)用MVC模式要求Web應(yīng)用程序中的每一個用戶輸入只采用請求的方式睬塌,在實際的開發(fā)中泉蝌,每個請求都被路由到控制器的一個方法上進(jìn)行操作,該控制器全權(quán)負(fù)責(zé)解釋這些請求揩晴,有可能會操作模型勋陪,然后選擇一個視圖反饋給用戶。
MVC5中控制器和視圖之間值得傳遞
關(guān)于值的傳遞我們知道有ViewBag,ViewData,ViewDataDictionary硫兰,模型(強類型)等形式進(jìn)行傳遞诅愚,
其實值都是通過ViewDataDictionary來傳遞的,數(shù)據(jù)從控制器傳送到視圖是通過一個名為ViewData的ViewDataDictionary(一個字典類)劫映,還有就是ViewBag是ViewData的動態(tài)封裝器违孝;
動態(tài)值不能作為一個參數(shù)傳遞給擴(kuò)展方法,因為C#編譯器為了選擇正確的擴(kuò)展方法泳赋,在編譯時必須知道每個參數(shù)的真正類型雌桑。
使用強類型模型對象,必須使所有的數(shù)據(jù)都是強類型數(shù)據(jù)摹蘑,以便在視圖中可以使用智能感知筹燕。
若是一般的類,在視圖中需要使用IEnumerable<>來指定衅鹿,
@model IEnumerable<RegisterExternalLoginModel>
要是控制器傳遞過來的數(shù)據(jù)本身就是IEnumerable或者其繼承它的類型撒踪,那么就只需要寫
@model RegisterExternalLoginModel
就可以出現(xiàn)了。
至于說ViewData[“”]和ViewBag.大渤;使用方法簡單制妄,但是建議大家少使用, 尤其是在一些大的項目里面泵三,我們完全可以將數(shù)據(jù)封裝到模型中耕捞,這樣通過模型在控制器和視圖之間進(jìn)行數(shù)據(jù)的傳遞。
@Razor視圖中的重要知識點
- :通過”@”來在視圖中寫C#代碼烫幕,同時編譯器也會將其看待為后臺語言進(jìn)行編譯俺抽,運行。
- :可以通過( )來區(qū)分一些常見的二義性较曼。
- :@@兩個轉(zhuǎn)義為一個@符號磷斧;
- :可以使用@{ }來區(qū)分代碼塊;
- :@Html.Raw():按照HTML格式來進(jìn)行編碼輸出捷犹;
- :@Html.RenderPartial(“Indx”);此區(qū)域放置局部視圖弛饭,不經(jīng)過控制器,可以往其傳遞model萍歉,這樣局部視圖中的model就是我們傳遞的侣颂;還有就是局部視圖不能指定布局。只能說像之前的那樣嵌套進(jìn)去枪孩。
- :@Hmtl.RenderAction();這個和上面是有區(qū)別的憔晒,是需要經(jīng)過控制器處理的;
- :@* 注釋*@蔑舞,此視圖中的注釋寫法丛晌;
- :調(diào)用泛型方法<>需要注意,可以使用@()來區(qū)分斗幼。
- :@Html.RenderBody()澎蛛,這個是在布局中定義的,最后是在此處嵌套網(wǎng)頁蜕窿。
- :@Html.RenderSection(“Footer”)谋逻;設(shè)置其下面的節(jié),可以在其網(wǎng)頁中顯示出來這個節(jié)桐经。
- :@Html.DisplayFor();視圖的輸出采用HTML輔助方法毁兆。
- :@Html.DropDownList();下拉列表.這里設(shè)置的是selectList();
<div id="body">
@RenderSection("featured", required: false)
<section class="content-wrapper main-content clear-fix">
@RenderBody()
</section>
</div>
@section featured {
<section class="featured">
<div class="content-wrapper">
<hgroup class="title">
<h1>@ViewBag.Title.</h1>
<h2>@ViewBag.Message</h2>
</hgroup>
<p>
To learn more about ASP.NET MVC visit
<a title="ASP.NET MVC Website">http://asp.net/mvc</a>.
The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.
If you have any questions about ASP.NET MVC visit
<a title="ASP.NET MVC Forum">our forums</a>.
</p>
</div>
</section>
}
這個自己定義的節(jié)點,取代我們在布局視圖中的@Html.RenderSection()阴挣;@section語法為布局中定義的一個節(jié)點指定了內(nèi)容气堕。如果想展示HTML標(biāo)簽,就返回一個System.Web.IHtmlString對象的實例。
對于復(fù)雜的應(yīng)用程序茎芭,我們想探討不同的架構(gòu)和設(shè)計模式來滿足我們的需求揖膜,領(lǐng)域驅(qū)動設(shè)計(DDD)是一種團(tuán)隊使用的方法,可用來處理復(fù)雜的應(yīng)用程序梅桩,命令查詢職責(zé)分離(CQRS)也是一種團(tuán)隊開發(fā)模式壹粟,它在復(fù)雜的應(yīng)用程序開發(fā)中占據(jù)主要的份額。
-
查詢數(shù)據(jù)時Include()的介紹
public ActionResult Edites()
{
var albums = db.albums.Include(a => a.Article).Include(a=>a.Genre);
return View(albums.ToList());
}
就比如說是上面的那樣宿百,這個Include趁仙,從數(shù)據(jù)庫取出的數(shù)據(jù)采用的是預(yù)加載策略,這個就是說盡其所能地使用查詢語句加載所有數(shù)據(jù)垦页。還有一種是延遲加載雀费,這個EF在Linq查詢中只加載主要對象數(shù)據(jù),而不是去填充我們的設(shè)置的對象痊焊。這個由一個弊端盏袄,就是每次需要多加載一個,這個就是說我們在聲明類對象的時候需要前面添加Virtual標(biāo)記宋光,這里的Include方法可以看成減少在構(gòu)建完整模型中需要的查詢數(shù)據(jù)的一個優(yōu)化貌矿。
模型綁定
之前只是知道在形參中傳遞模型(類),我們不需要管數(shù)據(jù)是如何過來的罪佳,底層的架構(gòu)已經(jīng)幫我們封裝好了逛漫,但是現(xiàn)在看書才發(fā)現(xiàn)之前了解的都有皮毛,沒有一點知識點赘艳。這個在驗證模型綁定之前有一個模型的驗證酌毡,ModelState.IsValid()通過這個來完成服務(wù)端的驗證,這個之前還有一個通過模型綁定器的東西蕾管。
([Bind(Include=”類中的屬性”,)])枷踏;
UpdataModel();
TryUpdateModel();
這兩個也是模型綁定驗證的,在前面掰曾。第二個返回一個布爾類型的值旭蠕。