同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁(yè) 優(yōu)化推廣 從零開(kāi)始學(xué)習(xí) ASP.NET MVC 1.0 (四) View/Model 全解

從零開(kāi)始學(xué)習(xí) ASP.NET MVC 1.0 (四) View/Model 全解

來(lái)源: | 時(shí)間:2010/8/9 14:41:46 |

一.摘要

本文講解在Action中向View傳遞Model的幾種方式.以及View獲取Model以后如何編寫(xiě)顯示邏輯.還詳細(xì)的介紹了ASP.NET MVC框架提供的Html Helper類的使用及如何為Html Helper類添加自定義擴(kuò)展方法.

二.承上啟下

上一篇文章中我們學(xué)習(xí)了Controller處理一次請(qǐng)求的全過(guò)程.在Controller的Action中, 會(huì)傳遞數(shù)據(jù)給View,還會(huì)通知View對(duì)象開(kāi)始顯示.所以Model是在Action中獲取的, 并由Action傳遞給View. View對(duì)象接到Action通知后會(huì)使用自己的顯示邏輯展示頁(yè)面.

image

下面首先讓我們學(xué)習(xí)如何將Model傳遞給View對(duì)象.

三.傳遞數(shù)據(jù)給View

在MVC中,Model對(duì)象是指包含了數(shù)據(jù)的模型. Controller將Model傳遞給View以后, View對(duì)象中不應(yīng)該做任何的業(yè)務(wù)邏輯處理, 僅僅根據(jù)Model對(duì)象做一些顯示邏輯的處理.

傳遞Model對(duì)象時(shí), 我們有兩種選擇:

1.傳遞一個(gè)弱類型的集合, 即成員為object類型的集合,  在View中需要將每個(gè)成員轉(zhuǎn)換成我們需要的類型,比如int, string,自定義類型等.

2.傳遞強(qiáng)類型對(duì)象, 這些類型是我們自定義的. 在View中直接使用我們傳遞的強(qiáng)類型對(duì)象, 不需要再轉(zhuǎn)換類型.

如果讓我們自己設(shè)計(jì)一個(gè)MVC框架, 我們也會(huì)想到上面兩種實(shí)現(xiàn)方式,接下來(lái)看看在ASP.NET MVC中的實(shí)現(xiàn).

1.傳遞弱類型的集合

(1) 如何傳遞

ASP.NET MVC框架定義了ViewContext類, 直譯后是"View上下文", 其中保存和View有關(guān)的所有數(shù)據(jù), 其中Model對(duì)象也封裝在了此類型中.

ViewContext對(duì)象包含三個(gè)屬性:

  • IView View
  • ViewDataDictionary ViewData
  • TempDataDictionary TempData

其中ViewData集合和TempData集合都是用來(lái)保存Model對(duì)象的.在一個(gè)Controller的Action中, 我們可以用如下方式為這兩個(gè)集合賦值:

        /// <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");
        }

 

在頁(yè)面中, 是用如下方式使用這兩個(gè)集合:

    <div>
        <% = ViewData["model"] %><br />
        <% = TempData["model"] %><br />
    </div>

 

(2) 傳遞過(guò)程

請(qǐng)注意Action中的賦值語(yǔ)句實(shí)際上操作的是Controller類的ViewData和TempData屬性, 此時(shí)并沒(méi)有任何的數(shù)據(jù)傳遞.上一篇文章中我們已經(jīng)學(xué)到, return View語(yǔ)句會(huì)返回一個(gè)ViewResult對(duì)象, 并且接下來(lái)要執(zhí)行ViewResult的Executeresult方法. Controller的View方法會(huì)將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對(duì)象:

        public override void ExecuteResult(ControllerContext context) {
          //...
            ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
            View.Render(viewContext, context.HttpContext.Response.Output);
          //...
        }

 

ViewContext對(duì)象最終會(huì)傳遞給ViewPage, 也就是說(shuō)ViewData和TempData集合傳遞到了ViewPage. 我這里簡(jiǎn)化了最后的傳遞流程, 實(shí)際上ViewData對(duì)象并不是通過(guò)ViewContext傳遞到ViewPage中的, ViewPage上的ViewData是一個(gè)單獨(dú)的屬性, 并沒(méi)有像TempData一樣其實(shí)訪問(wèn)的是ViewContext.TempData. 這么做容易產(chǎn)生奇異, 本類ViewContext是一個(gè)很好理解職責(zé)十分清晰的類. 作為使用者的我們暫時(shí)可以忽略這點(diǎn)不足, 因?yàn)槿绱藢?shí)現(xiàn)ViewData完全是為了下面使用強(qiáng)類型對(duì)象.

(3)ViewData和TempData的區(qū)別

雖然ViewData和TempData都可以傳遞弱類型數(shù)據(jù),但是兩者的使用是有區(qū)別的:

  • ViewData的生命周期和View相同, 只對(duì)當(dāng)前View有效.
  • TempData保存在Session中, Controller每次執(zhí)行請(qǐng)求的時(shí)候會(huì)從Session中獲取TempData并刪除Session, 獲取完TempData數(shù)據(jù)后雖然保存在內(nèi)部的字典對(duì)象中,但是TempData集合的每個(gè)條目訪問(wèn)一次后就從字典表中刪除. 也就是說(shuō)TempData的數(shù)據(jù)至多只能經(jīng)過(guò)一次Controller傳遞.

(4) TempData的實(shí)現(xiàn)

TempData的類型是TempDataDictionar

服務(wù)熱線

153 8323 9821

功能和特性

價(jià)格和優(yōu)惠

網(wǎng)站和維護(hù)

推廣和優(yōu)化

微信服務(wù)號(hào)