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的:
- 是从
ViewDataDictionary
inheritance的特殊字典。 - 用于从控制器发送数据来查看。
- 它的寿命是目前的要求。
- 如果您有
Redirect
,它将被销毁。 - 出于安全原因,最好在使用前检查它是否为
null
。 - 应该进行铸造操作。
ViewBag:
-
是一个dynamictypes(这种types是在C#4中呈现)。
-
像
ViewData
一样用于将数据从控制器发送到视图。 - 它在当前请求中的值的有效期限。
- 在页面之间redirect时,其值将为空。
- 出于安全原因,请检查它是否为
null
。 - 铸件不是必需的 ,所以比
ViewData
更快。
TempData的:
- 从
TempDataDictionary
派生的一种特殊的字典。 - 它具有生命期短 ,并用于发送页面之间的信息(
Redirect
)。 - 在完全呈现
View
之后,其值将为null
。 - 出于安全原因,请检查它是否为
null
。 - 应该进行铸造操作。
会议:
- 用于在不同的请求之间发送信息。
- 它的值不为
null
不为空值; 除非特定的时间(session expire
)。 - 出于安全原因,请检查它是否为
null
。 - 应该进行铸造操作。
本文解释了ViewData,ViewBag和TempData之间的区别。 我希望你可以参考这篇文章为您的需要。