ViewBag、ViewData和TempData使用方法、区别与联系
一、区别与联系
ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同;保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删除。因此TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。
ViewData与ViewBag使用的是同一个数据源,因此数据一样,只是ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型(http://www.cnblogs.com/kissdodog/archive/2013/01/20/2868644.html),它会在程序运行的时候动态解析。但是只有当访问的关键字是一个有效的C#标识符时,ViewBag才起作用。例如ViewData["have space"]用ViewBag是无法访问的。ViewData[]传递的key/value,value是Object数据类型,传递到View层之后要用as运算转换一下才能够变为强类型数据,但是ViewBag是在运行时才确定数据类型,因此根本不用转换。此处的不用转换类型是所有的类型,例如能够随意传递DateTime,String,其他自定义类型等等。但是就效率而言,ViewData[]稍高。
例如:
public ActionResult Index()
{
ViewData["Name"] = "李四";
ViewBag.Name = "张三";
return View();
}
@ViewData["Name"]; //输出张三
@ViewBag.Name; //输出张三
二、使用ViewData或ViewBag传递强类型数据
Controller代码:

public ActionResult Index()
{
var PeopleList = new List<People_Model>();
for (int i = 0; i < 10; i++)
{
People_Model p = new People_Model();
p.Id = i;
p.Name = "我是" + i;
p.Age = 20 + i;
PeopleList.Add(p);
}
ViewData["list"] = PeopleList;
return View();
}

public class People_Model
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
</tr>
@foreach(People_Model item in (ViewData["list"] as IEnumerable<People_Model>))
{
<tr>
<td>@item.Id</td>
<td>@item.Name</td>
<td>@item.Age</td>
</tr>
}
</table>

以上代码再来改写一下,以说明ViewData与ViewBag的区别,ViewBag是个好东西。先放入一个公共类代码:

public class Person
{
public Person(int id, int age, string name)
{
this.Id = id;
this.Age = age;
this.Name = name;
} public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }
}

控制器代码: 由于ViewBag与ViewData使用的是同一个数据源,因此控制器就使用ViewData传递数据,但是在视图里用不同的东西获取。

public ActionResult Index()
{
Person p1 = new Person(1, 20, "张飞");
Person p2 = new Person(2, 21, "关羽");
Person p3 = new Person(3, 22, "刘备");
List<Person> PersonList = new List<Person>();
PersonList.Add(p1);
PersonList.Add(p2);
PersonList.Add(p3);
ViewData["PList"] = PersonList;
return View();
}

视图代码:

@foreach (var p in ViewBag.PList) //应该注意到此行代码,根本不用转换数据类型
{
<div style=" line-height: 1.5 !important;">>@p.Name;</div>
} @foreach (var p in ViewData["PList"] as List<MVC_AjaxTest.Controllers.Person>) //而用ViewData读取的话要用as运算符转换为强类型数据
{
<div style=" line-height: 1.5 !important;">>@p.Name;</div>
}

三、TempData使用
下面用TempData来实现一个当提交表单时弹出提示,非表单提交不弹出提示的示例:
Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View();
} [HttpPost]
public ActionResult Index(string name)
{
TempData["Tips"] = "表单提交成功!";
return View();
}
}
}

视图:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
<script src="/Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
<% if(TempData["Tips"] != null) %>
<% { %>
alert('<%= TempData["Tips"]%>');
<% } %>
})
</script> </head>
<body>
<div>
<form action="/Home/Index" method="post">
<input type="text" name="name" value="测试js" />
<input type="submit" />
</form>
</div>
</body>
</html>

不知道大家是否有遇到过,提交了表单之后,老是不知道如何获取提交成功的提示。实际上,一个普通的表单提交,还真的比较适合页面提交。如果你出于其他原因觉得不适合使用AJAX的情况下,使用TempData的方式适合于不需要跳转的情况,提交后直接可以在本页面继续操作的情况。
TempData内部是将数据保存在Session里面的,至于实现了哪些接口,不说,因为知道了也没办法实现自定义的TempData。
ViewBag、ViewData和TempData使用方法、区别与联系的更多相关文章
- 2.ViewBag、ViewData、TempData之间的区别
1.ViewBag and ViewData(非跨视图访问) 1)ViewBag是一种dynamic动态类型,用户可以自定义属性并为其赋值,它会在运行时动态解析(例:可以作为变量.数组等各种对象传递并 ...
- ViewBag、ViewData、TempData之间的区别
1.ViewBag and ViewData(非跨视图访问) 1)ViewBag是一种dynamic动态类型,用户可以自定义属性并为其赋值,它会在运行时动态解析(例:可以作为变量.数组等各种对象传递并 ...
- mvc4中viewbag viewdata 和 tempdata的区别
ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析. eg: ViewBag.NumberObjs = new string[] { "on ...
- MVC3中 ViewBag、ViewData和TempData的使用和区别
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...
- ViewBag、ViewData和TempData的使用和区别
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData. MVC3中保留了ViewData的使用. ViewBag 是动态类型(dynamic),ViewData ...
- MVC3+中 ViewBag、ViewData和TempData的使用和区别
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...
- MVC3中 ViewBag、ViewData和TempData的使用和区别(不是自己写的)
(网上抄的,并未消化)在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic) ...
- MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)
MVC3中 ViewBag.ViewData和TempData的使用和区别 在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewD ...
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
在ASP.NET MVC中,视图数据可以通过ViewBag.ViewData.TempData来访问,其中ViewBag 是动态类型(Dynamic),ViewData 是一个字典型的(Diction ...
随机推荐
- gnuplot
一. 简介 gnuplot是一个命令行驱动的科学绘图工具,可将数学函数或数值资料以平面图或立体图的形式画在不同种类终端机或绘图输出装置上.gnuplot既支持命令行交互模式,也支持脚本. 二. 特性 ...
- UML--核心视图之用例图
如果说UML是一门语言,那么元素就是UML的基本词汇,视图就是语法. UML通过视图将基本元素组织在一起,形成有意义的句子. 静态视图,顾名思义,就是表达静态事物的.包括用例图.类图和包图. 用例图 ...
- bzoj1379 [Baltic2001]Postman
Description 邮递员每天给N个村子的人送信,每个村子可能在某个十字路口上,或一条路的中央. 村子里的人都希望早点收到信,因此与邮递员达成一个协议:每个村子都有一个期望值Wi,如果这个村子是邮 ...
- 【转】UltraISO制作U盘启动盘安装Win7/9/10系统攻略
U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...
- Best Meeting Point 解答
Question A group of two or more people wants to meet and minimize the total travel distance. You are ...
- Java异步调用Future对象
Future类存在于JDK的concurrent包中,主要用途是接收Java的异步线程计算返回的结果. 个人理解的使用场景大概如下: 有两个任务A和B,A任务中仅仅需要使用B任务计算成果,有两种方法实 ...
- 浅谈JS数据类型存储问题
背景 一个经典的问题,先抛出来给大伙看看: var a = "黑MAO"; var b = a; var c = new Object(); var d = c; a ...
- Unity 异步加载场景
效果图如下: 今天一直在纠结如何加载场景,中间有加载画面和加载完毕的效果动画! A 场景到 B , 看见网上的做法都是 A –> C –> B. C场景主要用于异步加载B 和 播放一些 ...
- Android 打造自己的个性化应用(四):仿墨迹天气实现-->自定义扩展名的zip格式的皮肤
在这里谈一下墨迹天气的换肤实现方式,不过首先声明我只是通过反编译以及参考了一些网上其他资料的方式推测出的换肤原理, 在这里只供参考. 若大家有更好的方式, 欢迎交流. 墨迹天气下载的皮肤就是一个zip ...
- Html5移动端页面布局通用模板暨移动端问题总结
最近的移动端项目终于告一段落了,其中遇到了不少问题,在此和大家总结分享. 首先,说一下结构.一般的手机页面大致可以分为五块:head, content, foot,solidbar,dialog. 针 ...