SP.NET mvc在绑定视图的时候经常会有控制器和视图之间传递信息,比如需要把验证信息传给视图显示。MVC中有常用的有ViewData,ViewBag,TempData当然还有Session。这几种到底有什么区别呢?
1、ViewBag与ViewData的相同点
1、都可以用于Controller到View传递信息。2、保存时间都是短暂的,当发生重定向或者跳转之后相应的信息都会不存在。
2、ViewBag与ViewData的不同点
1、ViewData是一个字典对象类型(dictionary),它是ViewDataDictionary的子类,键值为字符串。2、ViewBag是一个dynamic属性,dynamic是C# 4.0新增加的,ViewBag可以充分利用C# 4.0 dynamic的特性。
3、ViewData如果是存储的复杂类型的对象,在前台使用的时候需要类型转换,然后在调用其方法或者属性的时候是要加上是否为null检查,不然当为null时会报错。
4、ViewBag不需要空null检查,但是如果是复杂类型对象,要调用里面的方法或者属性也要进行类型转换。
ViewBag与ViewData使用例子:
- public ActionResult Index()
- {
- ViewBag.Name = "Monjurul Habib";
- return View();
- }
- public ActionResult Index()
- {
- ViewData["Name"] = "Monjurul Habib";
- return View();
- }
视图使用:
@ViewBag.Name
@ViewData["Name"]
3、TempData
TempData也是一个字典类型,继承于TempDataDictionary类,TempData与ViewBag,ViewData最大的区别是变量的存在的生命周期。当我们的在Controller或Action之间跳转的时候,TempData可以帮我们保存数据信息,而这些ViewTag和ViewData是做不到的。TempData和ViewData一样在前台使用的时候需要类型转换,然后在调用其方法或者属性的时候是要加上是否为null检查,不然当为null时会报错。TempData的使用
- public ActionResult Index()
- {
- var model = new Review()
- {
- Body = "Start",
- Rating=5
- };
- TempData["ModelName"] = model;
- return RedirectToAction("About");
- }
- public ActionResult About()
- {
- var model= TempData["ModelName"];
- return View(model);
- }
Session和TempData是key、value形式的字典类型,但是它的周期比较长,是网站会话级别的,当Session设置了值,如果没有到期或者清空key,就可以在接下来的所有页面使用。好处是Session存储的地方也可以根据自己的需要存储到内存或数据库。
viewstate 将在下一章节单独介绍。