ViewData和ViewBag允许您访问从控制器传递的视图中的任何数据.
这两者之间的主要区别是您访问数据的方式.
在ViewBag中,您使用字符串作为键访问数据 – ViewBag [“numbers”]
在ViewData中,您正在使用属性 – ViewData.numbers访问数据.
ViewData示例
CONTROLLER
var Numbers = new List<int> { 1,2,3 }; ViewData["numbers"] = Numbers;
视图
<ul> @foreach (var number in (List<int>)ViewData["numbers"]) { <li>@number</li> } </ul>
ViewBag示例
CONTROLLER
var Numbers = new List<int> { 1,3 }; ViewBag.numbers = Numbers;
视图
<ul> @foreach (var number in ViewBag.numbers) { <li>@number</li> } </ul>
会话是另一个非常有用的对象,它将保存任何信息.
// GetUserAuthorizationLevel - some method that returns int value for user authorization level. Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);
只要用户会话处于活动状态,该信息将被存储在会话中.
这可以在Web.config文件中更改:
<system.web> <sessionState mode="InProc" timeout="30"/>
那么在控制器里面的动作:
public ActionResult LevelAccess() { if (Session["AuthorizationLevel"].Equals(1)) { return View("Level1"); } if (Session["AuthorizationLevel"].Equals(2)) { return View("Level2"); } return View("AccessDenied"); }
TempData与ViewData和ViewBag非常相似,但它只包含一个请求的数据.
CONTROLLER
TempData["ClientAdded"] = "Client has been added";
视图
@if (TempData["ClientAdded"] != null) { <h3>@TempData["ClientAdded"] </h3> }
当您想将一些信息从View传递给Controller时,TempData很有用.例如,您希望在查看请求时保留时间.
视图
@{ TempData["DateOfViewWasAccessed"] = DateTime.Now; }
CONTROLLER
if (TempData["DateOfViewWasAccessed"] != null) { DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); }
解决方法
ViewBag,ViewData,TempData,Session – how and when to use them?
ViewBag
躲开它.可以使用视图模型.
行动
public ActionResult Index() { ViewBag.SomeProperty = "Hello"; return View(); }
查看(剃刀语法)
@ViewBag.SomeProperty
ViewData的
放弃它可以使用视图模型.
行动
public ActionResult Index() { ViewData["SomeProperty"] = "Hello"; return View(); }
查看(剃刀语法):
@ViewData["SomeProperty"]
温度数据
您在TempData中存储的所有内容将保留在tempdata中,直到您读取它,无论两者之间是否有一个或多个HTTP请求.
操作
public ActionResult Index() { TempData["SomeName"] = "Hello"; return RedirectToAction("Details"); } public ActionResult Details() { var someName = TempData["SomeName"]; }