MVC傳遞Model之TempData、ViewData、ViewBag區別及用途
MVC使用過程中經常會用到TempData、ViewData、ViewBag三種方式,這三種什麼區別呢?
TempData:預設儲存於Session中,可通過繼承ITempDataProvider介面改變,
生命週期:經過一次Controller傳遞就失效,即View讀取一次後對應的TempData即從TempData集合中刪除,不過如果TempData未被View讀取之前,其值可在Controller之間傳遞。PS:如果你不想TempData使用後就刪除,您可以通過TempData.Peek(“KEY”)來長期儲存,如果是隻想再儲存一次,再讀取一次後再刪除則要使用TempData.Keep(“KEY”),這樣如果再被讀取又會再次標記刪除。
ViewData:預設儲存為Dictionary鍵值對
生命週期:僅對當前View有效。
ViewBag:不再是以鍵值對形式存放,它以dynamic型別存放
生命週期:同ViewData一樣,僅對當前View有效
PS:ViewBag可看成是對ViewData的封裝,不過ViewBag不可以作為擴充套件方法的引數,因為擴充套件方法的引數型別必須明確
除了以上三種方式以外,還有ViewModel、PartialView和Tuple
ViewModel:它是基於檢視需求的Model,它可以把多個View Model以屬性的方式合併到一個View Model中。
優點:
● 把多個model放到一個View Model中
● 有智慧提示
● 安全性:Domain Model被隱藏
● 當Domain Model有變化,不需要修改檢視很多,只需要修改對應的View Model就可以
● 在Domain Model和View之間實現了鬆耦合
PartialView:對於哪些需要重複使用的檢視部分,提取出來作為部分檢視。
優點:
● 方便重複使用
● 只更新主檢視的某個部分
缺點:
● 多過的使用影響可讀性
Tuple:.NET 4.0推出的,是一個有序的、不可變的、固定大小的、允許存放多種型別的類。適合傳遞一些”小資料”,如果不想在ASP.NET MVC中建立View Model,可用Tuple來替代。
優點:
● 提供了一種不需要建立View Model而傳遞Model的方式。
缺點:
● 大小被限制:最多隻能存放8組資料。
● 值以item1, item2…來傳遞,很難確定item1, item2…到底代表哪組資料。
● 智慧提示不理想
例子:
□ HomeController
public ActionResult TupleDemo()
{
var allModels = new Tuple<List<Course>, List<Teacher>, List<Student>>(_repository.GetCourses(),
_repository.GetTeachers(), _repository.GetStudents()) {};
return View(allModels);
}
□ Home/TupleDemo.cshtml
@model Tuple <List <MvcApplication1.Models.Course>, List <MvcApplication1.Models.Teacher>, List <MvcApplication1.Models.Student>>
下拉框遍歷課程:
@foreach (var course in Model.Item1)
ajax請求老師課程表和學生上課表:
@Html.Raw(Json.Encode(Model.Item2))
@Html.Raw(Json.Encode(Model.Item3))
● 如果傳遞的是”小資料”,我們想到ViewBag, ViewData
● 當需要跨controller,跨action傳遞,我們想到TempData
● 如果基於View的Model,我們想到針對該View設計View Model
● 如果檢視的某個部分需要被重複使用,就把之提煉出來,成為一個Partial View
● 如果傳遞的是”小資料”,又不想使用View Model,可以考慮Tuple