45

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

4

3 回答 3

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

TempDataASP.NET MVC 将自动使您读取存储的值过期。在幕后 ASP.NET MVC 将信息保存到Session.

  • 会话- 与 TempData 相同,只是它永不过期 - 它对所有请求都有效,而不是单个重定向。
于 2012-10-01T16:10:01.713 回答
6

ASP.net MVC 引入了ViewData、ViewBag、TempData、Session来在控制器之间传递数据给视图。

查看数据

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

ViewBag也类似于 ViewData,唯一的区别是它可以使用动态对象动态共享数据。

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

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

protected void Session_Start(Object sender, EventArgs e) 
{
   int userType = 1;
   HttpContext.Current.Session.Add("_SessionUserType",userType );
}
于 2016-01-16T11:40:41.690 回答
5

查看数据:

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

查看包:

  • 是动态类型(此类型在 c#4 中呈现)。

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

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

临时数据:

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

会议:

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

本文解释了 ViewData、ViewBag 和 TempData 之间的区别。我希望你可以参考这篇文章来满足你的需要。

于 2016-11-21T06:46:15.690 回答