转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html

在ASP.NET MVC中,页面间Controller与View之间主要有以下几种小量数据的传值方式:ViewData、ViewBag、TempData和Session变量。

  下面就这四种传值方式做出详细介绍。

一、ViewData

  • ViewData是一个继承自ViewDataDictionary类的Dictionary对象,它只能存储String Key/Object Value字典数组。
  • ViewData 只在当前 Action 中有效,生命周期和 View 相同;
  • ViewData是从Controller向对应的View传递值。
  • ViewData的值只在当前的请求中有效,生命周期和View相同,其值不能再多个请求中共享。
  • 在重定向(Redirection)后,ViewData中存储的变量值将变为null。
  • 在取出ViewData中的变量值时,必须进行合适的类型转换和空值检查。

下面我们来看一个简单的例子,演示一下如何使用ViewData来从Controller向View传值。

 public ActionView Index()
{
ViewData["Message"] = "This is a message from ViewData."; return View();
}

然后我们在视图中使用这个变量:

 <div>
@ViewData["message"].ToString()
</div>

综上,ViewData更适合从Controller向View传递简单对象数据时使用。

二、ViewBag

  • ViewBag是一个动态类型变量(dynamic),这是C# 4.0引入的新特性,变量类型会在运行时进行解析。
  • ViewBag进本上是ViewData的包装,也是用来从Controller向View来传递值的。
  • VeiwBag也只是在当前的请求中有效。
  • 在重定向(Redirection)后,ViewBag中存储的变量值将变为null。
  • 因为ViewBag是动态类型,所以我们在取得其值时不需要进行类型转换。

同样,我们来通过一个简单的例子来演示一下如何利用ViewBag从Controller向View传递数据。

 public ActionView Index()
{
ViewBag.Message = "This is a message from ViewBag."; return View();
}

然后我们在视图中取出数据并显示:

 <div>
@ViewBag.Message
</div>

综上,ViewBag更适合从Conroller向View传递复杂数据时使用,因为取出存储在其中的数据变量时无需进行类型转换。

三、ViewData和ViewBag的区别和联系

1.ViewData和ViewBag其实是一回事,ViewBag其实是对ViewData的封装,其内部其实是使用ViewData实现内部存储的。

2.唯一的不同点是,ViewBag可以存储动态类型的变量值(dynamic),它会在程序运行的时候动态解析,而ViewData只能存储String Key/Object Value字典数组。

ViewData中的变量为Object类型,而ViewBag中的变量时dynamic类型,他们的区别是,dynamic类型在使用时会自动根据数据类型转换,而ViewData中的变量值则需要我们进行强制转换。

3.通过转到定义我们可以看到:

 [Dynamic]
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }

这里ViewBag只有get方法,没有set方法。

4.ViewData比ViewBag读取速度快。

四、TempData

  • TempData是一个继承自TempDataDictionary类的字典对象,它默认情况下是基于Session存储机制之上的。(备注:你也可以让你的TempData基于其他存储机制之上,我们可以提供我们自定义的ITempDataProvider来完成,详见http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx)。
  • TempData是用来在多个Actions或从当前请求向子请求,页面发生了重定向(Redirecion)时传递共享数据。
  • 只有在目标视图View完全加载后才有效。
  • 在取出TempData存储的变量时,必须进行合适的类型转换和空值检查。
  • TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。详情请看:http://www.cnblogs.com/tristanguo/archive/2009/04/06/1430062.html
  • TempData 保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删 除。具体代码层面,TempData获取过程是通过SessionStateTempDataProvider.LoadTempData方法从 ControllerContext的Session中读取数据,而后清除Session,故TempData只能跨Controller传递一次。
  • TempData 一般用于临时的缓存内容或抛出错误页面时传递错误信息(例如Edit页面Save操作成功后会跳转到Index页面,需要在Index页面显示保存成功的提示消息),可以将TempData 在使用之前存储到相应的 ViewData 中以备循环使用。

下面,我们来透过一个例子来演示一下如何在两个Action方法中传递数据。

首先创建一个Model类,如下

 public class Customer
{
public int Id { get; set; }
public string Code { get; set; }
public double Amount { get; set; }
}

然后在Controller中加入如下代码:

  public ActionView DisplayCustomer1
{
Customer customer = new Customer
{
Id = ,
Code = "",
Amount =
}; TempData["Customer"] = customer; return RedictToAction("DisplayCustomer2");
}
public ActionView DisplayCustomer2
{
Customer customer = TempData["OneCustomer"] as Customer; return View(customer );
}

最后创建一个强类型的视图来显示客户信息,此处代码略。

综上,TempData主要是用在需要在多个Acions或者页面重定向时共享传递数据时使用。

五、Session

  • Session也是ASP.NET MVC传递值得一种方式,和TempData不同的,用户整个回话期中Session都不会过期。
  • Session在同一用户会话过程中的所用请求中有效,比如,页面刷新。
  • Session中的值也需要进行类型转换和非空检查。

我们仍然使用上面的例子,假如我们不用TempData,而用Session也可以得到同样的结果。

  public AcionView DisplayCustomer1
{
Customer customer = new Customer
{
Id = ,
Code = "",
Amount =
}; Session["OneCustomer"] = customer; return RedictToAction("DisplayCustomer2");
} public ActionResult DisplayCustomer2
{
Customer customer = Session["OneCustomer"] as Customer; return View(customer);
}

Session的生命周期最长,但是它默认的是使用Cookies来存储数据,所以使用的时候必须注意数据保密的问题。

综上,Session主要在需要多个Controllers, Actions and Views共享数据(非敏感数据)时使用。

六、图说传递数据的生命周期

Maintains data between ViewData/ViewBag TempData Session
Controller to Controller No   Yes Yes
Controller to View Yes Yes Yes
View to Contorller No No Yes
 
 
 

ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session的更多相关文章

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

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

  2. dotNET5的MVC页面传值方式总结

    本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 一.经典回顾 二.Controller向View传值 1. ViewBag ...

  3. MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型

    为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By  Tom Dykstra |July 30, 2013 Translated by litdwg   ...

  4. 跟我学ASP.NET MVC之三:完整的ASP.NET MVC程序-PartyInvites

    摘要: 在这篇文章中,我将在一个例子中实际地展示MVC. 场景 假设一个朋友决定举办一个新年晚会,她邀请我创建一个用来邀请朋友参加晚会的WEB程序.她提出了四个注意的需求: 一个首页展示这个晚会 一个 ...

  5. 跟我学ASP.NET MVC之二:第一个ASP.NET MVC程序

    摘要: 本篇文章带你一步一步创建一个简单的ASP.NET MVC程序.  创建新ASP.NET MVC工程 点击“OK”按钮后,打开下面的窗口: 这里选择“Empty”模板以及“MVC”选项.这次不创 ...

  6. .NET手记-为ASP.NET MVC程序集成Autofac

    MVC Autofac总是会紧跟最新版本的ASP.NET MVC框架,所以文档也会一直保持更新.一般来讲,不同版本的框架集成Autofac的方法一般不变. MVC集成需要引用 Autofac.Mvc5 ...

  7. 05 入门 - 浅谈 ASP.NET MVC程序的工作原理

    目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容 1. Global.asax文件 2. RouteConfig.cs文件 3. 视图命名和寻址的规则 前面创建了一个简 ...

  8. 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器(转)

    用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器   现在不用Git,都不好意思说自己是程序员. 当你想用Git,而源代码服务器是Windows系统时,你 ...

  9. IIS8发布Asp.net MVC程序后出现404错误,处理程序staticFile

    新部署的虚拟机,运行Asp.net MVC程序,出现如下图错误: 解决方法: 添加功能和角色->添加角色->Web服务器IIS->应用程序开发->Asp.net3.5 /Asp ...

随机推荐

  1. 定制IE浏览器的尖兵利器 - BHO

    IE浏览器是当前使用人数最广的浏览器, 本文主要来讲述如何来打造我们自己特色的浏览器, 自定义工具栏按钮, 自定义网页的右击菜单, BHO技术与IE浏览器. 本文写作过程中参考不少网络上的相关资料, ...

  2. SQLite多线程读写实践及常见问题总结

    多线程读写 SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagen ...

  3. Topcoder SRM 630 (500 floyed 暴力 _builtin_popcount())

    题意:给n个点,保证图联通,给点相连的距离,求一个最多的点,这些点之间的距离都是相同的. 分析: 下面的代码是我们房间第一的大神的,写的很简洁,我的思路和他的一样,但是我不知道错哪了. 思路是暴力枚举 ...

  4. Android 获取屏幕尺寸与密度

      android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲 ...

  5. UVa 1475 (二分+半平面交) Jungle Outpost

    题意: 有n个瞭望塔构成一个凸n边形,敌人会炸毁一些瞭望台,剩下的瞭望台构成新的凸包.在凸多边形内部选择一个点作为总部,使得敌人需要炸毁的瞭望塔最多才能使总部暴露出来.输出敌人需要炸毁的数目. 分析: ...

  6. UVA 568 Just the Facts (水)

    题意: 求一个数n的阶乘,其往后数第1个不是0的数字是多少. 思路: [1,n]逐个乘,出现后缀0就过滤掉,比如12300就变成123,继续算下去.为解决爆long long问题,将其余一个数mod, ...

  7. windows 下使用 MinGW + msys 编译 ffmpeg

    本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处.    FFmpeg是在Linux平台下开发的,但 ...

  8. Oracle中如何判断一个字符串是否含有汉字

    看到网友问,怎么查询表中某个字段数据是不是包含了全角字符啊? 这个问题涉及到几个函数:to_single_byte.length和lengthb,我之前做开发的时候研究的是如何判断一个字符串中是否包含 ...

  9. Struts2的OGNL标签详解

    一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...

  10. TCP/IP详解学习笔记(6)-UDP协议

    1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 2.1.UDP端口号 ...