zoukankan      html  css  js  c++  java
  • mvc中viewData和TempData的区别

      刚写博客,错误的地方还请大家指出,大家一起学习!

      虽然ViewData和TempData都可以传递弱类型数据,但是两者的使用是有区别的:
        ViewData的生命周期和View相同, 只对当前View有效.TempData保存在Session中, Controller每次执行请求的时候会从Session中获取TempData并删除Session, 获取完TempData数据后虽然保存在内部的字典对象中,但是TempData集合的每个条目访问一次后就从字典表中删除. 也就是说TempData 的数据至多只能经过一次Controller传递.

      示例1:首先我们会创建一个TestController控制器,控制器有如下三个方法,视图主要的工作还是输出TempData的值;

     public class TestController : Controller
        {
            //
            // GET: /Test/
    
            public ActionResult Index()
            {
                TempData["val"] = "hello";
                return View();
            }
            public ActionResult One()
            {
                return View();
            }
            public ActionResult Two()
            {
                return View();
            }
        }

      在地址栏输入'../test/index',再次输入地址'../test/one'.我们可以在one视图中输出TempData['val']的值,但是我们再次在地址栏输入'../test/two',将会报错"未将对象引用到实例",说明TempData已经被销毁.

      实例2:

    public class TestController : Controller
        {
            //
            // GET: /Test/
            public ActionResult Index()
            {
                TempData["val"] = "hello";
                string val = TempData["val"].ToString();
                //我们试着读取TempData的值之后,TempData将会被销毁
                //但是这里有一个特殊的情况,并不是Tempdata访问后就会被销毁,
                //      而是Action返回的类型是ActionResult的子类RidrectResult,
                //      RedirectToRouteResult类时,TempData不会在Action放回View后被销毁,我们
                //      下节将会讲到
                return View();
            }
            public ActionResult One()
            {
                return View();
            }
            public ActionResult Two()
            {
                return View();
            }
        }

      当我们在地址栏输入'../test/index'后,我们再次在地址栏输入'../test/one'时,将会报错"未将对象引用到实例",说明TempData在已经在"string val =TempData["val"].ToString()时被销毁了.

      实例3:

     public class TestController : Controller
        {
            //
            // GET: /Test/
            public ActionResult Index()
            {
                TempData["val"] = "hello";
                string val = TempData["val"].ToString();
                return RedirectToAction("One");
            }
            public ActionResult One()
            {
                return RedirectToAction("Two");
            }
            public ActionResult Two()
            {
                return View();
            }

    但我们输入'../test/index'是,我们从firebug中可以看出

      可能有人会问不会报错吗?因为当我们读取TempData数据后,会自动销毁TempData.这点儿是没有错,但是mvc2有一个奇特的地方,mvc2.0只有将RedirectResult类或RedirectToRouteResult类当成ActionResult类时,才会强制保留TempData。除此之外,如果存在使用读取TempData的键值,默认就会在当次网页请求中将TempData清除.但是,如果只设定了TempData的值而没有读取的行为,TempData还会被保存到下一个页面中执行.

     

  • 相关阅读:
    在C#中实现高性能计时[转]
    序列化(Serializable)的学习
    日常常用英语
    使用javascript灵活控制DIV的位置
    酷我创始人雷鸣:程序员个人成长的四个要素
    String.Format格式说明
    各种类型转换的比较
    学好计算机英语
    AS关键字进行类型转化的优点以及限制
    Spoken English美国人常用的英语口语
  • 原文地址:https://www.cnblogs.com/unbreakable/p/2924711.html
Copyright © 2011-2022 走看看