说在前面文章转自 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.

MVC传值方式及优缺点的更多相关文章

  1. MVC&WebForm对照学习:传值方式

    刚从webform开发转到mvc,如果说像路由这样稍微复杂一点的知识点还可以暂时先放一放(前提是默认的路由规则基本满足大部分需求),那有个问题在快速开发中,我想是必须要当即解决的,那就是webform ...

  2. ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session

    转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html 在ASP.NET MVC中,页面间Controller与View之间主要有以下几种 ...

  3. ASP.NET MVC Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  4. MVC:Controller向View传值方式总结

    Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...

  5. MVC 向页面传值方式总结(2)

    MVC 向页面传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通View页面传一个Mo ...

  6. MVC 向页面传值方式总结(1)

    ViewData传值. HomeController.cs Co de: public ActionResult Index() {       ViewData["Title"  ...

  7. asp.net mvc各种传值方式大全

    MVC 各种传值方式 ViewData传值. HomeController.cs Co de: public ActionResult Index(){       ViewData["Ti ...

  8. MVC中页面的传值方式总结

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...

  9. MVC中页面传值方式总结

    MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一.Controller----------->View(控制器传到视图) 1.View ...

随机推荐

  1. U3D 实现地面碰撞效果

    前面讲了如何让两个刚体碰撞: 现在来细细讲解一下, 首先,精灵刚体后就好比物理世界的物体,是受到重力所用的, 然后两个物体要添加碰撞系数才能实现碰撞, 这种情况下,碰撞后会使得另一个刚体也会随之运动, ...

  2. C#中关于webconfig的读写

    近期一个小网站需要一个计数的信息 偷懒不想用别的什么方法 原本想用个xml 无奈不太会使 虽然不推荐这种方法 不过还是记下来方便日后查看 webconfig信息 <?xml version=&q ...

  3. Canvas模糊化处理图片、毛玻璃处理图片之stackblur.js

    Canvas实现毛玻璃效果解决方式1:使用stackblur.js 在Android系统中实现图片的毛玻璃效果比较好用的类库是:Android StackBlur 官方Git地址:https://gi ...

  4. PIL安装记录,编译支持jpeg png

    PIL是python理想的图片处理module,但是想要良好的支持各种图片,还需要检查一下几步,否则会提示:IOError: decoder jpeg not available之类的. 我的环境:L ...

  5. oracle decode函数使用方法

    1.decode(V1,1,A,2,B,C) 如果V1=1 那么显示A =2显示B 其他显示C ........ 2. 含义解释:  decode(条件,值1,返回值1,值2,返回值2,...值n,返 ...

  6. IOS应用程序生命周期&启动周期函数

    —程序的生命周期         a.程序的生命周期是指应用程序启动到应用程序结束整个阶段的全过程         b.每一个IOS应用程序都包含一个UIApplication对象,IOS系统通过该U ...

  7. What and where are the stack and heap?

    The stack is the memory set aside as scratch space for a thread of execution. When a function is cal ...

  8. UITapGestureRecognizer会屏蔽掉Button的点击事件( 转载)

    UITapGestureRecognis 前几天在做项目的时候,遇到这个一个问题,在一个视图也就是UIView上添加一个手势,然后又在这个View上添加一个UIButton,然后给按钮添加事件,运行项 ...

  9. mysql创建存储过程中的问题

    1.在创建存储过程成功后,使用call 存储过程名执行时报错: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_gener ...

  10. easyui tab 加载iframe 高度问题

    其实按网上搜的结果,easyui 有个data-options属性是fit:true. 加上他之后会使得自适应父类的宽高. 加上之后,发现个问题,当刷新tab内容的时候高度是对的,但是新建tab的时候 ...