C# · 12月 27, 2021

c# – ViewBag,ViewData,TempData,Session – 如何和何时使用它们?

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”];}