ASP.NET MVC中的ViewData,ViewBag,TempData以及viewstate的区别

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使用例子:

 
 
  1. public ActionResult Index()
  2. {
  3. ViewBag.Name = "Monjurul Habib";
  4. return View();
  5. }
  6. public ActionResult Index()
  7. {
  8. ViewData["Name"] = "Monjurul Habib";
  9. return View();
  10. }

视图使用:

@ViewBag.Name 
@ViewData["Name"] 

3、TempData

TempData也是一个字典类型,继承于TempDataDictionary类,TempData与ViewBag,ViewData最大的区别是变量的存在的生命周期。当我们的在Controller或Action之间跳转的时候,TempData可以帮我们保存数据信息,而这些ViewTag和ViewData是做不到的。TempData和ViewData一样在前台使用的时候需要类型转换,然后在调用其方法或者属性的时候是要加上是否为null检查,不然当为null时会报错。

TempData的使用
 
 
  1. public ActionResult Index()
  2. {
  3. var model = new Review()
  4. {
  5. Body = "Start",
  6. Rating=5
  7. };
  8. TempData["ModelName"] = model;
  9. return RedirectToAction("About");
  10. }
  11. public ActionResult About()
  12. {
  13. var model= TempData["ModelName"];
  14. return View(model);
  15. }

Session和TempData是key、value形式的字典类型,但是它的周期比较长,是网站会话级别的,当Session设置了值,如果没有到期或者清空key,就可以在接下来的所有页面使用。好处是Session存储的地方也可以根据自己的需要存储到内存或数据库。

viewstate 将在下一章节单独介绍。


猜你喜欢

转载自blog.csdn.net/chencai56/article/details/80667784