• ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session


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

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

    一、ViewData

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

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

    1 public ActionView Index()
    2 {
    3     ViewData["Message"] = "This is a message from ViewData.";
    4 
    5     return View();  
    6 }

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

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

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

    二、ViewBag

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

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

    1 public ActionView Index()
    2 {
    3     ViewBag.Message = "This is a message from ViewBag.";
    4 
    5     return View();  
    6 }

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

    1 <div>
    2     @ViewBag.Message
    3 </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.通过转到定义我们可以看到:

    1 [Dynamic]
    2 public dynamic ViewBag { get; }
    3 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类,如下

    1 public class Customer
    2 {
    3     public int Id { get; set; }
    4     public string Code {  get; set; }
    5     public double Amount {  get; set; }
    6 }

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

     1 public ActionView DisplayCustomer1
     2 {
     3     Customer customer = new Customer
     4     {
     5         Id = 1001,
     6         Code = "100101",
     7         Amount = 100
     8      };
     9 
    10     TempData["Customer"] = customer;
    11 
    12     return RedictToAction("DisplayCustomer2");
    13 }
    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也可以得到同样的结果。

     1 public AcionView DisplayCustomer1
     2 {
     3     Customer customer = new Customer
     4     {
     5          Id = 1001,
     6          Code = "10011",
     7          Amount = 100
     8     };
     9 
    10     Session["OneCustomer"] = customer;
    11 
    12     return RedictToAction("DisplayCustomer2");
    13 }
    14 
    15 public ActionResult DisplayCustomer2
    16 {
    17     Customer customer = Session["OneCustomer"] as Customer;
    18 
    19     return View(customer);
    20 }

    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
  • 相关阅读:
    java常用配置文件头部声明
    Error while launching application Error: spawn ENOMEM 解决
    Maven添加依赖后如何在IDEA中引用
    2017-2018 ACM-ICPC East Central North America Regional Contest (ECNA 2017)部分题解
    最小一乘法的一种数值算法?
    LOJ 6409. 「ICPC World Finals 2018」熊猫保护区
    min-max容斥复习
    BMCH
    大象
    关于高维卷积的一些不成熟的想法
  • 原文地址:https://www.cnblogs.com/sunshineground/p/4350216.html
Copyright © 2020-2023  润新知