MVC傳值方式及優缺點


文章轉自 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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM