ViewData和ViewBag是一回事, ViewBag其实是对ViewData的封装, 其内部其实是使用ViewData实现数据存储的。唯一的不同点是,ViewBag可以存储动态类型(dynamic)的变量值, 而ViewData只能存储String Key/Object Value字典数组。 所以我们可以将这四种方法归为三大类, ViewData和ViewBag, TempData, Session。
ViewData["key"]="What are you";
ViewBag.key="What are you";
在view中 获得值
因为ViewBag是对ViewData的封装,这两个所取得值是一样的,且只定义一个,另一个也可以取到值。
注:在取出ViewData中的变量值时,必须进行合适的类型转换(隐式或显式)和空值检查。
如果页面发生了跳转(Redirection),ViewBag和ViewData中的值将不复存在,ViewData、ViewBag的生命周期只有在从Controller到View中, 而TempData中的数据不仅在从Controller到View中有效,在不同的Action之间或者控制器中也有效。
TempData和Session
TempData["Message"] = "Hello ASP.NET MVC";
Session["Message"] = "Hello ASP.NET MVC";
TempData主要用来跨多个动作方法传递数据
TempData 数保存机制是Session,但与Session不完全相同。
- TempData中保存的数据,如果被使用,就会被清除,因此后面的请求将不能再次使用。
- TempData保存数据后,如果没有被使用,它的保存时间就是Session的生命周期。
Session
- Session也是ASP.NET MVC程序传递值的一种方式,但与TempData不同,用户的整个会话中Session都不会过期。
- Session在同一用户会话过程中的所有请求中有效,比如,刷新页面。
- Session中的值也需要进行类型转换(隐式或显式)和非空检查。
Session的生命周期是最长的,但是它默认使用的是Cookies来存储数据,所以使用的时候必须注意数据保密的问题。
综上, Session主要用在需要在多个Controllers, Actions and Views共享数据(非敏感数据)时使用。
创建强类型View
1.控制器 Action中将对象传到View
public ActionResult Test()
{
Students stu = new Students();
return View(stu);
}
2.View的顶部添加引用模型(这里传递的类型Students与上一步传递的对象类型必须一致)
3.视图中用Model.来引用
强类型视图多用于传递模型数据,不需要类型转换