MVC页面常见的三种传值方式(二)

上篇我们对比了ViewData和ViewBag,这次总结一下TempData


TempData


他的数据结构与ViewData一样都是字典类型,但是他是TempDataDictionary,他的不同点在于他的内部是使用Session来保存信息,我们都知道Temp是暂时的意思,所以保存在TempData中的信息存在的时间很短,只有一次网页要求。


他用于在Redirect的时候保存数据,因为如果使用ViewData、ViewBag在跳转后会变成null,但是TempData不会


应用场景:(一次网页要求)


在窗体数据送出Action保存,如果发生数据库新增失败的消息,我们会希望这次送出的数据可以保留至下一页,此时,就会将这个只希望出现一次的消息保存到TempData中,并在下一页进行取用


如下程序在更新数据库时发生失败后,会将这次收到的Message数据保存到TempData[“PostedMessage”]变量里,然后转回到了Create这个Action,数据重新从TempData[“PostedMessage”]再次读出,并传递到Create的view页面,由于ASP.NET MVC会记录TempData[“PostedMessage”]已经读取过了,所以,这次http要求退出前就会将TempData[“PostedMessage”]删除


        [HttpPost]
        public ActionResult Create(Message msg)
        {
            if (!UpdataMessageToDB(msg))
            {
                TempData["PostedMessage"] = msg;
                return RedirectToAction("Create");
            }
            return RedirectToAction("Index");

        }

        [HttpGet]
        public ActionResult Create()
        {
            string data = TempData["PostedMessage"] as Message;
            return View(data);

        }



注意


一般是要使用了TempData,就会配套使用RedirectResult或者RedirectToRouteResult来作为Action的回传类型,如果不是这两种类型,很可能导致TempData提前消失的情况。


补充知识

1.RedirectResult主要用途是重新导向到其他网址
2.RedirectToRouteResult:与上者类似,但是他是重导向到一个Action或Route
3.[HttpGet]、[HttpPost]、[HttpDelete]等属性都是动作方法选定器的一部分,如果在动作方法上套用了HttpGet属性,代表只有当客户端浏览器发送HTTP GET要求时,ActionInvoker才会选定这个Action


总结

controller回传到view的三种基本格式类型就总结完了,大多数使用viewdata和viewbag,这两种实质没有区别,只是viewbag是动态类型,因为两者的核心都是viewdata,所以可以相互转换,viewbag稍微的方便一些,但是肯定性能没有viewdata好,但是这种速度差也是可以忽略的,Tempdata有时候应用于页面跳转的时候,因为他可以保存数据到下一个页面,但是必须搭配着RedirectResult或者RedirectToRouteResult来使用

你可能感兴趣的:(MVC页面常见的三种传值方式(二))