【发布时间】:2013-03-04 14:30:37
【问题描述】:
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);
只要用户会话处于活动状态,此信息就会存储在会话中。 这可以在 Web.config 文件中更改:
<system.web>
<sessionState mode="InProc" timeout="30"/>
那么在控制器里面的action:
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());
}
【问题讨论】:
-
感谢您提供更多信息!这对大多数人来说应该很有帮助。
-
这里有问题还是这是一篇博文?回答你自己的问题很好,但它应该作为一个答案来完成,而不是作为问题的一部分。更重要的是,这个素材之前已经覆盖过,比如What is the right time for ViewData, ViewBag, Session, TempData
-
我会记住这一点,并为此感到抱歉。我试着举了更多的例子,也许一些更有经验的开发者也会分享他们的经验。
标签: c# asp.net-mvc visual-studio-2010