文章轉自 http://www.cxyclub.cn/n/49493/
在MVC控件器傳遞多個Model到視圖,使用ViewData,ViewBag,部分視圖,TempData,ViewModel,Tuple"中,體驗了使用不同的方式傳遞多個Model,而ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple都可以用來傳遞Model,如何取舍。本篇主要包括:
1:使用ViewData
2: 使用ViewBag
3: 使用PartialView
4: 使用TempData
5: 使用ViewModel
6: 使用Tuple
7: 總結
使用ViewData
ViewData是在ControllerBase中類型為ViewDataDictionary的屬性,以鍵值對的方式存儲,通過key來獲取值。
主要用途:
ViewData和ViewBag的作用是一樣的,只不過在早期的asp.net MVC版本(1和2)中,使用的是ViewData,后期的版本推出了ViewBag,它比ViewData有更多的優點,推薦使用ViewBag.
優點:
方便:以鍵值對的方式把Model存放起來,再從控制器傳遞到視圖。
缺點:
單向傳遞:只能從控制器傳遞到視圖。
只能存放當前請求下的Model:無法維持在多個請求下的Model,一旦頁面跳轉,ViewData的值就變成了null
只能存放"小數據":如果傳遞"大數據",不推薦使用ViewData。
使用key獲取的方式,可讀性不如ViewBag.
沒有智能提示
沒有編譯期錯誤檢查
使用ViewBag
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
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.
