什么是ViewData,ViewBag,Session,TempData的正确时间

MrM*_*MrM 42 asp.net-mvc session-variables

我正在编辑一个项目,我在一个控制器方法中看到了一个Session [""],在另一个控制器方法中看到了TempData [""].4之间是否存在差异,或者只是4种方式来做同样的事情.

Dar*_*rov 79

  • ViewData/ViewBag - 仅在当前请求的持续时间内有效.
    您在控制器操作中设置它并在视图中使用它然后它消失.
    区别在于第一个是字典而第二个只是dynamic这个字典的包装.
    两者都指向相同的数据.
    ViewBag是在ASP.NET MVC 3中引入的.

例:

public ActionResult Index()
{
    ViewData["foo"] = "bar";
    return View();
}
Run Code Online (Sandbox Code Playgroud)

在视图中,您可以使用此值:

<div>@ViewData["foo"]</div>
Run Code Online (Sandbox Code Playgroud)

与ViewBag相同,但它是动态的:

public ActionResult Index()
{
    ViewBag.foo = "bar";
    return View();
}
Run Code Online (Sandbox Code Playgroud)

在视图中,您可以使用此值:

<div>@ViewBag.foo</div>
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到,与使用视图模型的经典和推荐方式相比,ViewData/ViewBag只是​​将信息从控制器操作传递到视图的另一种方法:

public class MyViewModel
{
    public string Foo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public ActionResult Index()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

在强类型视图中:

@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,使用视图模型提供了一种强类型方法,可以将信息从控制器操作传递到视图.

  • TempData - 它允许在单个后续请求的持续时间内保留信息.您将内容存储在TempData中,然后重定向.在您重定向到的目标控制器操作中,您可以检索存储在TempData中的值.

例:

public ActionResult Foo()
{
    TempData["foo"] = "bar";
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var value = TempData["foo"] as string;
    // use the value here. If you need to pass it to the view you could
    // use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment)
    return View();
}
Run Code Online (Sandbox Code Playgroud)

TempData一旦您阅读它,ASP.NET MVC将自动使存储的值到期.ASP.NET MVC将信息保存在Session.

  • 会话 - 与TempData相同,但它永不过期 - 它对所有请求都有效,而不是单个重定向.

  • 您可以调用`Keep()`来取消将TempData的值取消为过期的`TempData.Keep("foo");`保持"foo"值`TempData.Keep();`以保留TempData的所有值 (17认同)
  • @BorisCallens,我认为更好的用例是在使用您无法作为参数传递的数据结构时.例如,具有数千条记录的DataTable.我就是那样用的.使用javascript我做了一个ajax调用,准备了数据表,然后通知我的视图,一切都很好,然后重定向到下载页面,下载是在没有闪烁页面的情况下进行的.它很棒.数据在使用后不会挂在内存中. (4认同)

mar*_*ker 6

ASP.net MVC引入了ViewData,ViewBag,TempData,Session来在控制器之间传递数据来查看.

ViewData的

ViewData是使用存储在CurrentRequestContext中的ViewDataDictionary类实现的.因此,ViewData生命周期将在当前请求结束时结束.

ViewBag也像ViewData一样,唯一的区别是它可以使用动态对象动态共享数据.

TempData是一个非常短暂的实例,您只应在当前后续请求期间使用它.如果您想在ASP.net MVC中使用重定向(RedirectToAction,RedirectToRoute,Redirect)并传递一些数据,这将非常方便重定向之间.TempData在Session中存储数据,但框架在当前和后续请求结束时处理数据.

会话是属于用户会话的长期(永不过期)数据.当您使用会容易导致问题的会话变量时,您需要注意.

protected void Session_Start(Object sender, EventArgs e) 
{
   int userType = 1;
   HttpContext.Current.Session.Add("_SessionUserType",userType );
}
Run Code Online (Sandbox Code Playgroud)


Eln*_*naz 5

查看数据:

  • 是从ViewDataDictionary.
  • 用于从控制器发送数据以查看。
  • 它的生命周期是当前的请求。
  • 如果你有,它就会被摧毁Redirect
  • 出于安全原因,最好null在使用前检查它。
  • 应为手术进行铸造。

查看包:

  • 是动态类型(该类型在 c#4 中出现)。

  • LikeViewData用于将数据从控制器发送到视图。

  • 其值在当前请求中的有效期的持续时间。
  • 在页面间重定向时,其值为空。
  • 出于安全原因,请在使用前检查null.
  • 铸造不是必需的,所以它比ViewData.

临时数据:

  • 一种特殊的字典,源自TempDataDictionary.
  • 它的生命周期,用于在页面之间发送信息 ( Redirect)。
  • View完全渲染后,其值为null
  • 出于安全原因,请在使用前检查null.
  • 应为手术进行铸造。

会议:

  • 用于在不同请求之间发送信息。
  • 它的值null不是空值;除非经过一段时间(session expire)。
  • 出于安全原因,请在使用前检查null.
  • 应为手术进行铸造。

这篇文章解释了 ViewData、ViewBag 和 TempData 之间的区别。我希望您可以根据需要参考这篇文章。