我正在编辑一个项目,我在一个控制器方法中看到了 Session[""],在另一个控制器方法中看到了 TempData[""]。这 4 种之间有区别吗?或者只是 4 种方法来做同样的事情。
dynamic
包装。 示例:
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>
如您所见,使用视图模型提供了一种强类型方法,将信息从控制器操作传递到视图。
示例:
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
。
ASP.net MVC 引入了 ViewData、ViewBag、TempData、Session 在控制器与视图之间传递数据。
查看数据
ViewData是通过存储在CurrentRequestContext中的ViewDataDictionary类实现的。因此,ViewData 生命周期将在当前请求结束时结束。
ViewBag也类似于ViewData,唯一的区别是它可以使用动态对象动态共享数据。
TempData 是一个非常短暂的实例,您应该仅在 current 和 subsequent 请求期间使用它。如果您想在 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 );
}
查看数据:
ViewDataDictionary
的特殊字典。Redirect
,它将被摧毁。null
。查看包:
是一个动态类型(该类型在c#4中出现)。
像
ViewData
一样用于将数据从控制器发送到视图。null
。ViewData
更快。临时数据:
TempDataDictionary
的一种特殊词典。Redirect
)。View
后,其值为null
。null
。会议:
null
非空值;除非过了一定时间(session expire
)。null
。这篇文章解释了ViewData、ViewBag和TempData之间的区别。希望您可以参考这篇文章来满足您的需要。