服務(wù)熱線
153 8323 9821
本文講解在Action中向View傳遞Model的幾種方式.以及View獲取Model以后如何編寫顯示邏輯.還詳細的介紹了ASP.NET MVC框架提供的Html Helper類的使用及如何為Html Helper類添加自定義擴展方法.
上一篇文章中我們學習了Controller處理一次請求的全過程.在Controller的Action中, 會傳遞數(shù)據(jù)給View,還會通知View對象開始顯示.所以Model是在Action中獲取的, 并由Action傳遞給View. View對象接到Action通知后會使用自己的顯示邏輯展示頁面.
下面首先讓我們學習如何將Model傳遞給View對象.
在MVC中,Model對象是指包含了數(shù)據(jù)的模型. Controller將Model傳遞給View以后, View對象中不應(yīng)該做任何的業(yè)務(wù)邏輯處理, 僅僅根據(jù)Model對象做一些顯示邏輯的處理.
傳遞Model對象時, 我們有兩種選擇:
1.傳遞一個弱類型的集合, 即成員為object類型的集合, 在View中需要將每個成員轉(zhuǎn)換成我們需要的類型,比如int, string,自定義類型等.
2.傳遞強類型對象, 這些類型是我們自定義的. 在View中直接使用我們傳遞的強類型對象, 不需要再轉(zhuǎn)換類型.
如果讓我們自己設(shè)計一個MVC框架, 我們也會想到上面兩種實現(xiàn)方式,接下來看看在ASP.NET MVC中的實現(xiàn).
ASP.NET MVC框架定義了ViewContext類, 直譯后是"View上下文", 其中保存和View有關(guān)的所有數(shù)據(jù), 其中Model對象也封裝在了此類型中.
ViewContext對象包含三個屬性:
其中ViewData集合和TempData集合都是用來保存Model對象的.在一個Controller的Action中, 我們可以用如下方式為這兩個集合賦值:
/// <summary>
/// 傳遞弱類型Model的Action示例
/// </summary>
/// <returns>ViewResult</returns>
public ActionResult WeakTypedDemo()
{
ViewData["model"] = "Weak Type Data in ViewData";
TempData["model"] = "Weak Type Data in TempData";
return View("WeakTypedDemo");
}
在頁面中, 是用如下方式使用這兩個集合:
<div>
<% = ViewData["model"] %><br />
<% = TempData["model"] %><br />
</div>
請注意Action中的賦值語句實際上操作的是Controller類的ViewData和TempData屬性, 此時并沒有任何的數(shù)據(jù)傳遞.上一篇文章中我們已經(jīng)學到, return View語句會返回一個ViewResult對象, 并且接下來要執(zhí)行ViewResult的Executeresult方法. Controller的View方法會將Controller類的ViewData和TempData屬性值傳遞給ViewResult,代碼如下:
protected internal virtual ViewResult View(IView view, object model) {
if (model != null) {
ViewData.Model = model;
}
return new ViewResult {
View = view,
ViewData = ViewData,
TempData = TempData
};
}
然后在ViewResult中根據(jù)ViewData和TempData構(gòu)建ViewContext對象:
public override void ExecuteResult(ControllerContext context) {
//...
ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
View.Render(viewContext, context.HttpContext.Response.Output);
//...
}
ViewContext對象最終會傳遞給ViewPage, 也就是說ViewData和TempData集合傳遞到了ViewPage. 我這里簡化了最后的傳遞流程, 實際上ViewData對象并不是通過ViewContext傳遞到ViewPage中的, ViewPage上的ViewData是一個單獨的屬性, 并沒有像TempData一樣其實訪問的是ViewContext.TempData. 這么做容易產(chǎn)生奇異, 本類ViewContext是一個很好理解職責十分清晰的類. 作為使用者的我們暫時可以忽略這點不足, 因為如此實現(xiàn)ViewData完全是為了下面使用強類型對象.
雖然ViewData和TempData都可以傳遞弱類型數(shù)據(jù),但是兩者的使用是有區(qū)別的:
TempData的類型是TempDataDictionar