ViewData,ViewBag,Session,TempData是什么时候?

我正在编辑一个项目,我看到一个控制器方法中的Session [“”]和另一个控制器方法中的TempData [“”]。 这四个之间有区别,还是只有四种方法来做同样的事情?

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

例:

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

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

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

与ViewBag一样,但它是dynamic的:

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

并在你的强types视图中:

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

正如你所看到的,使用视图模型提供了一种将信息传递给控制器​​操作视图的强types方法。

  • TempData – 它允许在一个后续请求的持续时间内保存信息。 你在TempData中存储一些东西,然后redirect。 在redirect到的目标控制器操作中,您可以检索存储在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相同,但它永不过期 – 它将对所有请求有效,而不是单个redirect。

ASP.net MVC介绍了ViewData,ViewBag,TempData,Session之间传递数据的控制器来查看。

ViewData的

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

ViewBag也像ViewData一样,唯一不同的是它使用dynamic对象dynamic共享数据。

TempData是一个非常短暂的实例,只能在当前后续请求中使用它。如果要在ASP.net MVC中使用redirect(RedirectToAction,RedirectToRoute,redirect)并传递一些数据在redirect之中。 TempData将数据存储在Session中,但当前和后续请求结束时,框架将configuration数据。

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

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

ViewData的:

  • 是从ViewDataDictionaryinheritance的特殊字典。
  • 用于从控制器发送数据来查看。
  • 它的寿命是目前的要求。
  • 如果您有Redirect ,它将被销毁。
  • 出于安全原因,最好在使用前检查它是否为null
  • 应该进行铸造操作。

ViewBag:

  • 是一个dynamictypes(这种types是在C#4中呈现)。

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

  • 它在当前请求中的值的有效期限。
  • 在页面之间redirect时,其值将为空。
  • 出于安全原因,请检查它是否为null
  • 铸件不是必需的 ,所以比ViewData更快。

TempData的:

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

会议:

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

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