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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...