ViewBag,ViewData,TempData,Session - 如何以及何时使用它们?

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 - 如何以及何时使用它们?

ViewBag

躲开它.尽可能使用视图模型.

原因是当您使用动态属性时,您将不会遇到编译错误.通过意外或目的更改属性名称非常容易,然后忘记更新所有用法.

如果您使用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)

ViewData的

避免它.尽可能使用视图模型.与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)