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。

相关文章
相关标签/搜索