在"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。