在"MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple"中,体验了使用不同的方式传递多个Model,而ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple都可以用来传递Model,如何取舍呢?本篇主要包括:

使用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。

参考资料:
How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC

MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍的更多相关文章

  1. MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple

    从控制器传递多个Model到视图,可以通过ViewData, ViewBag, PartialView, TempData, ViewModel,Tuple等,本篇逐一体验.本篇源码在github. ...

  2. spring mvc handler的三种方式

    springmvc.xml 三种方式不能针对一个controller同时使用 <?xml version="1.0" encoding="UTF-8"?& ...

  3. C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小

    上一篇我们说到大文件的分片下载.断点续传.秒传,有的博友就想看分片下载,我们也来总结一下下载的几种方式,写的比较片面,大家见谅^_^. 下载方式: 1.html超链接下载: 2.后台下载(四种方法:返 ...

  4. ElasticSearch搜索数据到底有几种方式?

    Elasticsearch允许三种方式执行搜索请求: GET请求正文: curl -XGET "http://localhost:9200/app/users/_search" - ...

  5. spring mvc 参数传递的三种方式

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  6. mvc 重定向的几种方式

    在RouteConfig添加一个简单的路由 //新增路由 routes.MapRoute( name: "Article", url: "Detial/{id}" ...

  7. 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别

    ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.my ...

  8. ASP.NET MVC传递Model到视图的多种方式总结

    ASP.NET MVC传递Model到视图的多种方式总结 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel T ...

  9. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

随机推荐

  1. Python基础 - 系统进程调用

    subprocess模块 近期发现还有一个更好的用于取代subprocess的库,sh,也是openstack当中使用的库.

  2. Maven3 生命周期与插件(笔记五)

    第一节:Maven 生命周期 Maven 生命周期简介:Maven 通过插件的方式完成一系列过程来实现功能. Maven 拥有三套独立的生命周期: Clean 清理项目 Default 构建项目 Si ...

  3. 自己动手编译OpenSSL库

    因为工作需要,要实现一个基于SSL的通信程序.之前没有接触过SSL协议通讯,这次学习了一下如何自己编译OpenSSL库. 我使用的环境是Windows 10 + VS2015 1.首先打开VS2015 ...

  4. sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

    Description In the two-player game "Two Ends", an even number of cards is laid out in a ro ...

  5. mongo体系架构学习

    MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据 ...

  6. day6面向对象

    面向对象介绍(http://www.cnblogs.com/alex3714/articles/5188179.htm)     世界万物,皆可分类     世界万物,皆为对象     只要是对象,就 ...

  7. C语言:输入一个多位的数字,12345,求各位相加1+2+3+4+5=15

    题目: 输入一个多位的数字,12345,求各位相加1+2+3+4+5=15(10分)题目内容: 输入一个多位的数字,1求各数位相加. 例如输入12345,则计算1+2+3+4+5=15 输入格式: 一 ...

  8. python mysql连接函数

    def mysqlConnectionSql(sql,value): try: conn=MySQLdb.connect(host='127.0.0.1',user='webuser',passwd= ...

  9. 【POJ】1026.Cipher

    题解 置换群的快速幂,然而我姿势水平不高,样例过不去,然后才明白这个置换的意思是这个位置上的数代表要把原位置的某个数换过来 需要新开一个数组存结果 代码 #include <iostream&g ...

  10. openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader

    该异常是创建代理时加载接口的类加载器与创建时传入的不一致. 在本地eclipse做openfire二次开发,本地运行没错,部署到服务器上后报异常:  java.lang.IllegalArgument ...