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.
MVC传值方式及优缺点的更多相关文章
- MVC&WebForm对照学习:传值方式
刚从webform开发转到mvc,如果说像路由这样稍微复杂一点的知识点还可以暂时先放一放(前提是默认的路由规则基本满足大部分需求),那有个问题在快速开发中,我想是必须要当即解决的,那就是webform ...
- ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html 在ASP.NET MVC中,页面间Controller与View之间主要有以下几种 ...
- ASP.NET MVC Controller向View传值方式总结
Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...
- MVC:Controller向View传值方式总结
Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...
- MVC 向页面传值方式总结(2)
MVC 向页面传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通View页面传一个Mo ...
- MVC 向页面传值方式总结(1)
ViewData传值. HomeController.cs Co de: public ActionResult Index() { ViewData["Title" ...
- asp.net mvc各种传值方式大全
MVC 各种传值方式 ViewData传值. HomeController.cs Co de: public ActionResult Index(){ ViewData["Ti ...
- MVC中页面的传值方式总结
MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...
- MVC中页面传值方式总结
MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一.Controller----------->View(控制器传到视图) 1.View ...
随机推荐
- require.js优化器
项目发布前,require.js优化器可以合并require.js各个模块. 官网: http://requirejs.org/docs/optimization.html 安装 npm instal ...
- java 更改list 某一元素?
if(!elTd.getElementsByTag("p").isEmpty()){ int i=eduList.size(); if(i>0){ ...
- 用PHP实现一个高效安全的ftp服务器(二)
接前文. 1.实现用户类CUser. 用户的存储采用文本形式,将用户数组进行json编码. 用户文件格式: * array( * 'user1' => array( * 'pass'=>' ...
- 关于UIScrollView属性和方法的总结
iOS中UIScollView的总结 在iOS开发中可以说UIScollView是所有滑动类视图的基础,包括UITableView,UIWebView,UICollectionView等等,UIScr ...
- ScheduleThreadPoolExecutor源码分析(二)
DelayedWorkQueue: DelayedWorkQueue实现了BlockingQueue接口,因此其可以作为线程池的任务队列.BlockingQueue的主要属性有以下几个: privat ...
- VS2010 Cstring to int
今天遇到一个将Cstring转化为int的问题,用atoi(),发现不可以,找了一下原因. 原来因为在VS2015(2010)的版本中是UNICODE ,请使用这个函数 _ttoi() . CStri ...
- c++文件读写相关
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: ...
- python3 读写excel
一直认为python3可以很快的实现很多简单的功能,今天要读excel表格数据,想来很简单,网上一搜,用xlrd即可,然后很多人给出了不同的版本,号称xlrd3,实际上官网一看,xlrd0.9.4兼容 ...
- 学习笔记--【转】Parameter与Attribute的区别&servletContext与ServletConfig区别
原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001 Parameter与Attribute的区别 request. ...
- 在Linux终端执行clear或top命令时出现:'xterm': unknown terminal type
在Linux终端执行clear或top命令时出现:'xterm': unknown terminal type的错误. 例如: [root@localhost phpmyadmin]# clear ' ...