ViewData 和 ViewBag 允许您访问从控制器传递的视图中的任何数据。
这两者之间的主要区别在于您访问数据的方式。在 ViewBag 中,您使用字符串作为键来访问数据 - ViewBag[“numbers”] 在 ViewData 中,您正在使用属性 - ViewData.numbers 来访问数据。
查看数据示例
控制器
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示例
控制器
var Numbers = new List<int> { 1, 2, 3 };
ViewBag.numbers = Numbers;
看法
<ul>
@foreach (var number in ViewBag.numbers)
{
<li>@number</li>
}
</ul>
Session是另一个非常有用的对象,它可以保存任何信息。
例如,当用户登录系统时,您希望保留他的授权级别。
// GetUserAuthorizationLevel - some method that returns int value for user authorization level.
Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);
只要用户会话处于活动状态,此信息就会存储在 Session 中。这可以在 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非常相似,但是它只包含一个请求的数据。
控制器
// 您创建了一个添加新客户端的方法。
TempData["ClientAdded"] = "Client has been added";
看法
@if (TempData["ClientAdded"] != null)
{
<h3>@TempData["ClientAdded"] </h3>
}
当您想将一些信息从 View 传递到 Controller 时,TempData 很有用。例如,您希望在请求查看时保持时间。
看法
@{
TempData["DateOfViewWasAccessed"] = DateTime.Now;
}
控制器
if (TempData["DateOfViewWasAccessed"] != null)
{
DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString());
}