由于之前在項目中也使用MVC進行開發,但是具體是那個版本就不是很清楚了,但是我覺得大體的思想是相同的,只是版本高的在版本低的基礎上增加了一些更加方便操作的東西。下面是我學習ASP.NET MVC5高級編程(5)的一些知識筆記,有些簡單的操作沒有進行記錄,一些知識點就使用思維導圖來寫出大體的知識架構。
MVC5是完全Bin部署的,也就是說我們最后發布的時候只是將Bin文件下面的應用程序的程序集發布就可以,對于服務器來說只需要有.NET 4.5就可以進行安裝了。
一條至理名言“約定優于配置”
這是在使用MVC時經常聽到的話,之前不懂是什么意思,現在隨著編碼次數的增多,對于這句話也有了自己的理解,大體的意思就是說按照人家的之前的約定,不要隨意調整項目中的目錄,結構。也對現在整個MVC項目的架構都搭建好了,如果說需要調整那么可能是一個大的工程,我們需要對整個底層使用到的相關地方都需要做更改?,F在的整個結構有一個理念是“使應用程序的關注點分離,讓開發人員更加方便的開發?!?/p>
MVC提供的是方法調用的結果,不是動態生成頁面(腳本)。
在Web中使用MVC時,應用MVC模式要求Web應用程序中的每一個用戶輸入只采用請求的方式,在實際的開發中,每個請求都被路由到控制器的一個方法上進行操作,該控制器全權負責解釋這些請求,有可能會操作模型,然后選擇一個視圖反饋給用戶。
MVC5中控制器和視圖之間值得傳遞
關于值的傳遞我們知道有ViewBag,ViewData,ViewDataDictionary,模型(強類型)等形式進行傳遞,
其實值都是通過ViewDataDictionary來傳遞的,數據從控制器傳送到視圖是通過一個名為ViewData的ViewDataDictionary(一個字典類),還有就是ViewBag是ViewData的動態封裝器;
動態值不能作為一個參數傳遞給擴展方法,因為C#編譯器為了選擇正確的擴展方法,在編譯時必須知道每個參數的真正類型。
使用強類型模型對象,必須使所有的數據都是強類型數據,以便在視圖中可以使用智能感知。
若是一般的類,在視圖中需要使用IEnumerable<>來指定,
@model IEnumerable<RegisterExternalLoginModel>
要是控制器傳遞過來的數據本身就是IEnumerable或者其繼承它的類型,那么就只需要寫
@model RegisterExternalLoginModel
就可以出現了。
至于說ViewData[“”]和ViewBag.;使用方法簡單,但是建議大家少使用, 尤其是在一些大的項目里面,我們完全可以將數據封裝到模型中,這樣通過模型在控制器和視圖之間進行數據的傳遞。
@Razor視圖中的重要知識點
- :通過”@”來在視圖中寫C#代碼,同時編譯器也會將其看待為后臺語言進行編譯,運行。
- :可以通過( )來區分一些常見的二義性。
- :@@兩個轉義為一個@符號;
- :可以使用@{ }來區分代碼塊;
- :@Html.Raw():按照HTML格式來進行編碼輸出;
- :@Html.RenderPartial(“Indx”);此區域放置局部視圖,不經過控制器,可以往其傳遞model,這樣局部視圖中的model就是我們傳遞的;還有就是局部視圖不能指定布局。只能說像之前的那樣嵌套進去。
- :@Hmtl.RenderAction();這個和上面是有區別的,是需要經過控制器處理的;
- :@* 注釋*@,此視圖中的注釋寫法;
- :調用泛型方法<>需要注意,可以使用@()來區分。
- :@Html.RenderBody(),這個是在布局中定義的,最后是在此處嵌套網頁。
- :@Html.RenderSection(“Footer”);設置其下面的節,可以在其網頁中顯示出來這個節。
- :@Html.DisplayFor();視圖的輸出采用HTML輔助方法。
- :@Html.DropDownList();下拉列表.這里設置的是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>
}
這個自己定義的節點,取代我們在布局視圖中的@Html.RenderSection();@section語法為布局中定義的一個節點指定了內容。如果想展示HTML標簽,就返回一個System.Web.IHtmlString對象的實例。
對于復雜的應用程序,我們想探討不同的架構和設計模式來滿足我們的需求,領域驅動設計(DDD)是一種團隊使用的方法,可用來處理復雜的應用程序,命令查詢職責分離(CQRS)也是一種團隊開發模式,它在復雜的應用程序開發中占據主要的份額。
-
查詢數據時Include()的介紹
public ActionResult Edites()
{
var albums = db.albums.Include(a => a.Article).Include(a=>a.Genre);
return View(albums.ToList());
}
就比如說是上面的那樣,這個Include,從數據庫取出的數據采用的是預加載策略,這個就是說盡其所能地使用查詢語句加載所有數據。還有一種是延遲加載,這個EF在Linq查詢中只加載主要對象數據,而不是去填充我們的設置的對象。這個由一個弊端,就是每次需要多加載一個,這個就是說我們在聲明類對象的時候需要前面添加Virtual標記,這里的Include方法可以看成減少在構建完整模型中需要的查詢數據的一個優化。
模型綁定
之前只是知道在形參中傳遞模型(類),我們不需要管數據是如何過來的,底層的架構已經幫我們封裝好了,但是現在看書才發現之前了解的都有皮毛,沒有一點知識點。這個在驗證模型綁定之前有一個模型的驗證,ModelState.IsValid()通過這個來完成服務端的驗證,這個之前還有一個通過模型綁定器的東西。
([Bind(Include=”類中的屬性”,)]);
UpdataModel();
TryUpdateModel();
這兩個也是模型綁定驗證的,在前面。第二個返回一個布爾類型的值。