MVC到底使用哪一種方式傳遞Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之間取捨

在"MVC控制器傳遞多個Model到視圖,使用ViewData, ViewBag, 部分視圖, TempData, ViewModel, Tuple"中,體驗了使用不一樣的方式傳遞多個Model,而ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple均可以用來傳遞Model,如何取捨呢?本篇主要包括:安全

使用ViewData大數據

使用ViewBag設計

使用PartialViewit

使用TempDataio

使用ViewModel編譯

使用Tuplemodel

總結請求

使用ViewData總結

3數據

ViewData是在ControllerBase中類型爲ViewDataDictionary的屬性,以鍵值對的方式存儲,經過key來獲取值。

主要用途:

ViewData和ViewBag的做用是同樣的,只不過在早期的ASP.NET MVC版本(1和2)中,使用的是ViewData,後期的版本推出了ViewBag,它比ViewData有更多的優勢,推薦使用ViewBag。

優勢:

● 方便:以鍵值對的方式把Model存放起來,再從控制器傳遞到視圖。

缺點:

● 單向傳遞:只能從控制器傳遞到視圖。

● 只能存放當前請求下的Model:沒法維持在多個請求下的Model,一旦頁面跳轉,ViewData的值就變成了null

● 只能存放"小數據":若是要傳遞"大數據",不推薦使用ViewData。

● 使用key獲取的方式,可讀性不如ViewBag。

● 沒有智能提示

● 沒有編譯期錯誤檢查

使用ViewBag

4

ViewData是在ControllerBase中類型爲dynamic的屬性,是name/value形式的字典。dynamic類型是C# 4.0推出的一個類型,它使得在編譯期不須要指明類型。

主要用途:

● 以name/value的形式把Model存放起來,再從控制器傳遞到視圖。視圖的Title就是經過ViewBag.Title來設置的。

優勢:

● 方便

● 使用name獲取對應的值,比ViewData使用key獲取對應的值,來得更好。

● 不須要顯式指明類型

缺點:

● 單向傳遞:只能從控制器傳遞到視圖。

● 只能存放當前請求下的Model:沒法維持在多個請求下的Model,一旦頁面跳轉,ViewBag的值就變成了null

● 只能存放"小數據":若是要傳遞"大數據",不推薦使用ViewBag。

● 沒有智能提示

● 沒有編譯期錯誤檢查

使用PartialView

主要用途:

對於哪些須要重複使用的視圖部分,提取出來做爲部分視圖。

優勢:

● 方便重複使用

● 只更新主視圖的某個部分

缺點:

● 多過的使用影響可讀性

使用TempData

5

TempData在ControllerBase中類型爲TempDataDictionary的屬性,是鍵值對形式的字典,經過key來獲取對應的值,在賦值的時候須要顯式指明類型。和ViewData和ViewBag的不一樣之處在於:它能夠跨controller,跨action來使用,其內部使用了Session機制。

主要用途:

能夠用來傳遞一些非敏感類的數據,好比驗證、錯誤信息等。

優勢:

● 跨controller,跨action

缺點:

● 須要顯式賦值,並須要判斷是否爲null以免錯誤

● 沒有智能提示

使用ViewModel

它是基於視圖需求的Model,它能夠把多個View Model以屬性的方式合併到一個View Model中。

優勢:

● 把多個model放到一個View Model中

● 有智能提示

● 安全性:Domain Model被隱藏

● 當Domain Model有變化,不須要修改視圖不少,只須要修改對應的View Model就能夠

● 在Domain Model和View之間實現了鬆耦合

使用Tuple

Tuple是在.NET 4.0推出的,是一個有序的、不可變的、固定大小的、容許存放多種類型的類。

主要用途:

適合傳遞一些"小數據",若是不想在ASP.NET MVC中建立View Model,可用Tuple來替代。

優勢:

● 提供了一種不須要建立View Model而傳遞Model的方式。

缺點:

● 大小被限制:最多隻能存放8組數據。

● 值以item1, item2...來傳遞,很難肯定item1, item2...到底表明哪組數據。

● 智能提示不理想

總結

● 若是傳遞的是"小數據",咱們想到ViewBag, ViewData。

● 若是基於View的Model,咱們想到針對該View設計View Model。

● 若是視圖的某個部分須要被重複使用,就把之提煉出來,成爲一個Partial View。

● 當須要跨controller,跨action傳遞,咱們想到TempData。

● 若是傳遞的是"小數據",又不想使用View Model,能夠考慮Tuple。

相關文章
相關標籤/搜索