MVC中的ViewData、ViewBag和TempData
一、ViewBag和ViewData的定义
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }
二、ViewBag和ViewData的差别
| viewdata | viewbag |
| 它是key/value字典集合 | 它是dynamic类型对象 |
| 从asp.net mvc1就有了 | 从asp.netmvc3才有 |
| 基于asp.netframework 3.5 | 基于asp.net framework4.0 |
| viewdata比viewbag快 | viewbag比viewdata慢 |
| 页面查询数据时须要转换合适的类型 | 在页面查询数据时不须要转换合适的类型 |
| 有一些类型转换代码 | 可读性较好 |
ViewBag不再是字典的键值对结构。而是dynamic动态类型,它会在程序执行的时候动态解析。
ViewBag.NumberObjs = new string[] { "one", "two", "three" };
ViewData["NumberArrs"] = new string[] { "one", "two", "three" };
//正确,dynamic类型的解析作用,foreach能够使用
foreach (var item in ViewBag.NumberObjs)
{
}
//错误:foreach语句不可作用于object类型对象上
foreach (var item in ViewData["NumberArrs"])
{
}
1、ViewBag事实上本质就是ViewData,仅仅是多了层Dynamic控制。所以,使用何种方式全然取决于你的个人爱好。
2、ViewBag和ViewData仅针对当前Action中有效,生命周期和view同样。
三、TempData
保存在session中,Controller每次运行请求时。会从session中获取tempdata。而后清空session,获取完tempdata数据,尽管保存在内部字典中。
可是字典中每一个条目訪问一次后就从字典中删除。因此Tempdata数据最多仅仅能经过一次controller传递。而且每一个元素最多仅仅能訪问一次,之后删除。
四、举例
<pre name="code" class="csharp">public ActionResult UsingViewData()
{
ViewData["Title"] = "Using ViewData";
ViewData["ProjectName"] = "My Test Project";
ViewData["ProjectDescription"] = "This is TestProject to demo Viewdata and viewbag details";
ViewData["StartDate"] = new DateTime(2011, 1, 1);
ViewData["TotalPrice"] = 1000;
ViewData["TotalDays"] = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client", "Mr.Client");
stackholder.Add("Manager","Mr.Joy");
stackholder.Add("Team Leader","Mr.Toy");
stackholder.Add("Sr.developer","Mr.dojoy");
stackholder.Add("developer","Mr.nodoy");
ViewData["stackholder"]=stackholder; List<string>modules =new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewData["modules"]=modules;
return View();
}
<div><span style="color: rgb(35, 35, 35); font-family: Verdana, Arial, helvetica, sans-seriff; font-size: 14px; line-height: 25px; orphans: 2; text-align: -webkit-auto; widows: 2;">相应UsingViewData View的cshtml:</span></div><pre name="code" class="html">@{
ViewBag.Title = "UsingViewData";
}
<h1>@ViewData["Title"]</h1>
<div>
<div>
<h2>Project Name : @ViewData["ProjectName"]</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewData["ProjectDescription"]".</p>
</div>
<div>
Stack Holder :
<br />
<ul id="stakholder">
@foreach ( var stakerholder in ViewData["stackholder"] as Dictionary<string, string> )
{
<li>
@stakerholder.Key : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List :
<ul id="modulelist">
@foreach ( var module in ViewData["modules"] as List<string> )
{
<li>
@module
</li>
}
</ul>
</div>
Project StartDate : @ViewData["StartDate"] <br />
Project TotalPrice: @ViewData["TotalPrice"] <br />
Project TotaDays : @ViewData["TotalDays"]
</div>
</div>
ViewBag controller:
public ActionResult UsingViewBag()
{
ViewBag.Title = "Using ViewBag";
ViewBag.ProjectName = "My Test Project";
ViewBag.ProjectDescription = "This is Test Project to demo Viewdata and viewbag details";
ViewBag.StartDate = new DateTime(2011, 1, 1);
ViewBag.TotalPrice = 1000;
ViewBag.TotalDays = 100;
Dictionary<string, string> stackholder = new Dictionary<string, string>();
stackholder.Add("Client", "Mr.Client");
stackholder.Add("Manager", "Mr.Joy");
stackholder.Add("Team Leader", "Mr.Toy");
stackholder.Add("Sr.developer", "Mr.doyjoy");
stackholder.Add("developer", "Mr.nodoy");
ViewBag.stackholder = stackholder; List<string> modules = new List<string>();
modules.Add("Admin module");
modules.Add("ShoppingCart module");
modules.Add("CMS module");
ViewBag.modules = modules;
return View();
}
相应的页面:
@{
ViewBag.Title = "UsingViewBag";
}
<h1>@ViewBag.Title</h1>
<div>
<div>
<h2>Project Name : @ViewBag.ProjectName</h2>
</div>
<div>
ProjectDescription :
<p>"@ViewBag.ProjectDescription.</p>
</div>
<div>
Stack Holder :
<br />
<ul id="stakholder">
@foreach ( var stakerholder in ViewBag.stackholder )
{
<li>
@stakerholder.Key : @stakerholder.Value
</li>
}
</ul>
</div>
<div>
Project Details:<br />
<div>
module List :
<ul id="modulelist">
@foreach ( var module in ViewBag.modules )
{
<li>
@module
</li>
}
</ul>
</div>
Project StartDate : @ViewBag.StartDate.ToString("dd-MMM-yyyy") <br />
Project TotalPrice: @ViewBag.TotalPrice ₹ <br />
Project TotaDays : @ViewBag.TotalDays
</div>
</div>
五、总结
1、ViewData和TempData是字典类型,赋值方式用字典方式。ViewData["myName"]
2、ViewBag是动态类型,使用时直接加入属性赋值就可以 ViewBag.myName
3、ViewBag和ViewData仅仅在当前Action中有效,等同于View
4、TempData能够通过转向继续使用,由于它的值保存在Session中。但TempData仅仅能经过一次传递。之后会被系统自己主动清除
5、ViewData和ViewBag中的值能够互相訪问。由于ViewBag的实现中包括了ViewData
MVC中的ViewData、ViewBag和TempData的更多相关文章
- Asp.net MVC中的ViewData与ViewBag
Asp.net MVC中的ViewData与ViewBag 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它 ...
- 浅谈 MVC中的ViewData、ViewBag和TempData
ViewBag和TempData的区别 ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才 ...
- 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别
ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.my ...
- ASP.NET MVC 中的ViewData与ViewBag
在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...
- Asp.net MVC中的ViewData与ViewBag(转)
在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...
- [转]Asp.net MVC中的ViewData与ViewBag
本文转自:http://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html 在Asp.net MVC 3 web应用程序中,我们会用到V ...
- MVC中数据传递 ViewBag的使用
ViewBag MVC3中 ViewBag.ViewData和TempData的使用和差别 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留 ...
- MVC中不能使用ViewBag
在工程文件中添加 <Reference Include="Microsoft.CSharp" /> <Reference Include="System ...
- 译:什么是ViewData的, ViewBag和TempData? - MVC为当前和后续请求之间传递数据的三种方法
译文出处:http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-cplusViewBagplusandplusTem AS ...
随机推荐
- nodeJS学习(7)--- WS开发 NodeJS 项目-节2 <安装&设置&启动 mongodb 数据库++遇到的问题>
本文系统 win7 参考:http://lib.csdn.net/article/mongodb/58097 http://www.cnblogs.com/lzrabbit/p/3682510.ht ...
- hdu 1423 最长上升递增子序列
#include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...
- Playing with String(codeforces 305E)
题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...
- codeforces round375(div.2)题解
首先吐槽一下这套题...为什么EF全是图论QAQ 过了ABCD四个题...F的并查集死磕了好久... 不过似乎rank还算乐观...(因为ABC都是一次过的QAQ) Problem A: 啥都不想说Q ...
- Javascript&Html-弹出窗口的屏蔽程序
大多数的浏览器都内置了弹出窗口的屏蔽程序,即使没有内置此类屏蔽程序的浏览器,用户也可以安装Yahoo tool等带有内置屏蔽程序的应用工具. 结果就是用户可以将绝大多数弹出窗口屏蔽掉. 于是,再弹出窗 ...
- IHTMLDocument2的所有成员、属性、方法、事件[转]
原文发布时间为:2010-07-01 -- 来源于本人的百度文章 [由搬家工具导入] IHTMLDocument2 InterfaceGets information about the docume ...
- shell文本过滤编程(一):grep和正则表达式【转】
转自:http://blog.csdn.net/shallnet/article/details/38799739 版权声明:本文为博主原创文章,未经博主允许不得转载.如果您觉得文章对您有用,请点击文 ...
- [翻译][Nokogiri官方教程] 解析HTML/XML文档 / Parsing an HTML/XML Document
From a String From a File From the Internet Parse Options Encoding 原文: Parsing an HTML/XML Document ...
- linux 通过MD5监控指定路径文件的变动
脚本须知: 1. 运行此脚本的用户必须是root,因为在某些文件所在路径普通用户没有访问权限 2. 源文件和其md5码只要有一方内容有改动,都会导致校验失败,所以校验码的保存就至关重要防止其他人修改, ...
- extern "C"解析
转自大牛的解析(非常具体详细)http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html 我做个简单的标注方便以后自己查看: 在用C++ ...