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

时间:2012-10-01 16:06:04

标签: asp.net-mvc session-variables

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

3 个答案:

答案 0 :(得分:75)

  • ViewData / ViewBag - 仅在当前请求期间有效。
    您将其设置为控制器动作并在视图中使用它,然后它就会消失。
    不同之处在于第一个是字典而第二个只是这个词典的dynamic包装器。
    两者都指向相同的数据。
    ViewBag是在ASP.NET MVC 3中引入的。

示例:

public ActionResult Index()
{
    ViewData["foo"] = "bar";
    return View();
}

在视图中你可以使用这个值:

<div>@ViewData["foo"]</div>

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

public ActionResult Index()
{
    ViewBag.foo = "bar";
    return View();
}

在视图中你可以使用这个值:

<div>@ViewBag.foo</div>

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

public class MyViewModel
{
    public string Foo { get; set; }
}

然后:

public ActionResult Index()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

并在强类型视图中:

@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>

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

  • 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();
}

ASP.NET MVC会在您阅读后自动使TempData中存储的值失效。 ASP.NET MVC将信息保存在Session

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

答案 1 :(得分:5)

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 );
}

答案 2 :(得分:4)

的ViewData:

  • 是从ViewDataDictionary继承的特殊字典。
  • 用于从控制器向视图发送数据。
  • 它的生命周期是当前的要求。
  • 如果您有Redirect,则会被销毁。
  • 出于安全原因,最好在使用前检查null
  • 应该进行铸造以进行操作。

ViewBag:

  • 是动态类型(此类型在c#4中显示)。

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

  • 当前请求中其值的有效期。
  • 在页面之间重定向时,其值将为null。
  • 出于安全原因使用前,请检查null
  • 不需要投射,因此它比ViewData更快。

TempData的:

  • TempDataDictionary
  • 派生的特殊字典
  • 短生命周期,用于在页面之间发送信息(Redirect)。
  • 完全呈现View后,其值将为null
  • 出于安全原因使用前,请检查null
  • 应该进行铸造以进行操作。

会话:

  • 用于在不同请求之间发送信息。
  • 其值不是null不是空值;除非在一定时间后(session expire)。
  • 出于安全原因使用前,请检查null
  • 应该进行铸造以进行操作。

This文章解释了ViewData,ViewBag和TempData之间的区别。我希望你能根据自己的需要推荐这篇文章。