Ada*_*cki 15 c# asp.net-mvc visual-studio-2010
ViewData和ViewBag允许您访问从控制器传递的视图中的任何数据.
这两者之间的主要区别在于您访问数据的方式.在ViewBag中,您使用字符串作为键访问数据 - ViewBag ["numbers"]在ViewData中,您使用属性访问数据 - ViewData.numbers.
ViewData示例
CONTROLLER
var Numbers = new List<int> { 1, 2, 3 };
ViewData["numbers"] = Numbers;
Run Code Online (Sandbox Code Playgroud)
视图
<ul>
@foreach (var number in (List<int>)ViewData["numbers"])
{
<li>@number</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
ViewBag示例
CONTROLLER
var Numbers = new List<int> { 1, 2, 3 };
ViewBag.numbers = Numbers;
Run Code Online (Sandbox Code Playgroud)
视图
<ul>
@foreach (var number in ViewBag.numbers)
{
<li>@number</li>
}
</ul>
Run Code Online (Sandbox Code Playgroud)
Session是另一个非常有用的对象,可以保存任何信息.
例如,当用户登录到系统时,您希望保持其授权级别.
// GetUserAuthorizationLevel - some method that returns int value for user authorization level.
Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);
Run Code Online (Sandbox Code Playgroud)
只要用户会话处于活动状态,此信息就会存储在会话中.这可以在Web.config文件中更改:
<system.web>
<sessionState mode="InProc" timeout="30"/>
Run Code Online (Sandbox Code Playgroud)
那么在控制器里面的动作:
public ActionResult LevelAccess()
{
if (Session["AuthorizationLevel"].Equals(1))
{
return View("Level1");
}
if (Session["AuthorizationLevel"].Equals(2))
{
return View("Level2");
}
return View("AccessDenied");
}
Run Code Online (Sandbox Code Playgroud)
TempData与ViewData和ViewBag非常相似,但它只包含一个请求的数据.
CONTROLLER
//您创建了一个添加新客户端的方法.
TempData["ClientAdded"] = "Client has been added";
Run Code Online (Sandbox Code Playgroud)
视图
@if (TempData["ClientAdded"] != null)
{
<h3>@TempData["ClientAdded"] </h3>
}
Run Code Online (Sandbox Code Playgroud)
当您想要将一些信息从View传递给Controller时,TempData非常有用.例如,您希望在请求查看时保留时间.
视图
@{
TempData["DateOfViewWasAccessed"] = DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)
CONTROLLER
if (TempData["DateOfViewWasAccessed"] != null)
{
DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString());
}
Run Code Online (Sandbox Code Playgroud)
jga*_*fin 17
ViewBag,ViewData,TempData,Session - 如何以及何时使用它们?
躲开它.尽可能使用视图模型.
原因是当您使用动态属性时,您将不会遇到编译错误.通过意外或目的更改属性名称非常容易,然后忘记更新所有用法.
如果您使用ViewModel,则不会出现此问题.视图模型还将MVC中的"M"(即业务实体)从控制器和视图调整到ViewModel的责任,因此您可以获得具有明确职责的更清晰的代码.
行动
public ActionResult Index()
{
ViewBag.SomeProperty = "Hello";
return View();
}
Run Code Online (Sandbox Code Playgroud)
查看(剃刀语法)
@ViewBag.SomeProperty
Run Code Online (Sandbox Code Playgroud)
避免它.尽可能使用视图模型.与ViewBag相同的原因.
行动
public ActionResult Index()
{
ViewData["SomeProperty"] = "Hello";
return View();
}
Run Code Online (Sandbox Code Playgroud)
查看(剃刀语法):
@ViewData["SomeProperty"]
Run Code Online (Sandbox Code Playgroud)
TempData
无论是否存在一个或多个HTTP请求,您存储的所有内容都将保留在tempdata中,直到您阅读它为止.
操作
public ActionResult Index()
{
TempData["SomeName"] = "Hello";
return RedirectToAction("Details");
}
public ActionResult Details()
{
var someName = TempData["SomeName"];
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29169 次 |
最近记录: |