Asp.net MVC4高級編程學習筆記-視圖學習第一課20171009
首先解釋下:本文只是對Asp.net MVC4高級編程這本書學習記錄的學習筆記,書本內容感覺挺簡單的,但學習容易忘記,因此在邊看的同時邊作下了筆記,可能其它朋友看的話沒有情境和邏輯順序還請諒解!
一、MVC控制器渲染視圖的三種方式。
如下以HomeController控制器中的代碼為例:
1、默認方式
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(); //註意這裏是渲染Views目錄下的Home子目錄(通過HomeController中的Home來找到子目錄Home)下視圖名稱為action名稱值為Sample(public ActionResult Sample()為HomeControll聲明的action名稱為Sample)的視圖,文件名為Sample.cshtml
2、指定視圖名稱方式
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(“MySampleView”);//註意這裏是渲染Views目錄下的Home子目錄下視圖名稱為MySampleView的視圖,文件名為MySampleView.cshtml。
}
3、指定不同目錄下視圖方式
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(“~/Views/Example/Index.cshtml”);//這裏是常數Views目錄下的Example子目錄下的視圖Index的視圖,文件名為Index.cshtml。
}
二、控制器通過ViewData和ViewBag向視圖傳遞信息。
ViewData是一種字典數據類型。
Example:
ViewData[“CurrentTime”]=DateTime.Now;
ViewBag是一種動態數據類型(dynamic)。上面的ViewData賦值等價於下面的賦值
Example:
ViewBag.CurrentTime=DateTime.Now;
註意差異:如果ViewData中的key有空格是不能用ViewBag訪問的,比如
ViewData[“full name”]是不能轉換成ViewBag式的;另外就是ViewBag中的值是不能作為參數傳遞的,因為不確定數據類型,除非使用ViewData方式傳參或者強制數據類型轉換,比如
@Html.TextBox(“name”,ViewBag.name);這種寫法編譯是通不過的,需要改成如下兩種形式,
@Html.TextBox(“name”,ViewData[“name”]);
@Html.TextBox(“name”,(string)ViewBag.name);
ViewData是一種ViewDataDictionary類型,並非僅僅是Dictionary類型,它有一個Model屬性,可以用來在視圖中獲取指定的模型對象。例如用它來在視圖中傳遞指定模型:
public ActionResult List()
{
var albums=new List<Album>();
for(int i=0;i<10;i++)
{
albums.Add(new Album{Title=”Album”+i})
}
return View(albums);
}
在後臺需要先把View方法中的參數值賦給ViewData.Model屬性。然後告知視圖哪種類型的模型正在使用@model聲明。註意這裏需要輸入模型類型的完全限定類型名(命名空間和類型名稱),如下所示:
//參數值賦給ViewData.Model屬性
@model IEnumberable<MVCApplication1.Models.Album>
<ul>
@foreach(Album p in Model)
{
<li>@p.Title</li>
}
</ul>
如果不想輸出完整類型名可以使用using。
@using MVCApplication1.Models
//參數值賦給ViewData.Model屬性
@model IEnumberable< Album>
<ul>
@foreach(Album p in Model)
{
<li>@p.Title</li>
}
</ul>
對於視圖經常使用的命名空間,可以在View目錄下的web.config中配置<add namespace="LYG.HelloWorld" />
Example:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="LYG.HelloWorld" />
</namespaces>
</pages>
</system.web.webPages.razor>
三、視圖模型
通過MVC的模型Model在傳入視圖時,往往有一個主視圖多個從視圖或其它無關信息比如登陸信息、用戶權限信息等。我們可以考慮主視圖聲明到@model中,其它信息放到ViewData中。但這樣做並非適合所有人開發需求,如要要嚴格控制視圖流入的數據,就必須所有數據都是強類型,以便視圖編寫人員能智能感知。這裏因此引入視圖模型的概念,就是把所有數據再組合成一個模型成為視圖模型傳入到@model中,比如如下購物車視圖模型包括主視圖產品信息,其它信息總價格和顯示給用戶的消息的代碼示例。
Public class shoppingCatViewModel
{
Public IEnumberable<Product> products{get;set} //主視圖
Public decimal totalPrice{get;set;} //總價格
Public string message{get;set;} //顯示給用戶的消息
}
然後通過@model shoppingCatViewModel 向這個模型中強制性地輸入一個視圖。
今天的學習到此為此,下一課將詳細介紹Razor語法。
Asp.net MVC4高級編程學習筆記-視圖學習第一課20171009