在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用。ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary)。
它们的定义如下:
public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; }
控制器中代码:
public ActionResult Index() { ViewBag.Message_ViewBag = "I am viewbag"; ViewData["Message_ViewData"] = "I am viewdata"; return View(); }
视图代码:
@{ ViewBag.Title = "主页"; } <h2>@ViewBag.Message_ViewBag</h2> <h2>@ViewData["Message_ViewData"]</h2>
当然我们可以在视图里面这样写:
<h2>@ViewBag. Message_ViewData </h2> <h2>@ViewData["Message_ViewBag "]</h2>
运行结果是一样的,这里表示它们俩是互通的。
ViewBag和ViewData的区别:
ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。
TempData的使用
同ViewData和ViewBag一样,TempData也可以用来向视图传递数据。只是ViewData和ViewBag的生命周期和View相同,只对当前View有用。而TempData则可以在不同的Action中进行传值,类似webform里的Seesion。如下:public ActionResult Index(){ ViewBag.hello = "hello,this is viewBag"; ViewData["hi"] = "hi,this is viewData"; TempData["abc"] = "this is tempdata"; return View(); }
然后在About视图里面调用:
<h2>关于</h2> <p> @ViewBag.hello @ViewData["key"] @TempData["abc"] </p>
这里只获取到了TempData["abc"]的值,但是TempData的值在取了一次后则会自动删除,这时我再刷新页面,则TempData["abc"]为Null了。通过反编译查看代码,发现TempData数据在调用后则会自动删除。