ViewData、ViewBag、Session、TempData 什么时候合适

问题描述 投票:0回答:3

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

asp.net-mvc session-variables
3个回答
89
投票
  • 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();
}
一旦您读取了存储在

TempData

 中的值,
ASP.NET MVC 将自动使其过期。在幕后,ASP.NET MVC 将信息保存到
Session

  • Session - 与 TempData 相同,只是它永不过期 - 它将对所有请求有效,而不是单个重定向。

6
投票

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

查看数据

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

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

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

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

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

5
投票

查看数据:

  • 是继承自
    ViewDataDictionary
    的特殊字典。
  • 用于从控制器发送数据到视图。
  • 它的寿命就是当前的要求。
  • 如果你有
    Redirect
    ,它将被摧毁。
  • 为了安全起见,使用前最好检查一下
    null
  • 手术前应进行铸造。

查看包:

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

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

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

临时数据:

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

会议:

  • 用于在不同请求之间发送信息。
  • 其值不是
    null
    非空值;除非过了一定时间(
    session expire
    )。
  • 出于安全考虑,使用前请检查是否
    null
  • 手术前应进行铸造。

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

© www.soinside.com 2019 - 2024. All rights reserved.