我正在编辑一个项目,我在一个控制器方法中看到了 Session[""],在另一个控制器方法中看到了 TempData[""]。4 之间是否有区别,或者只是 4 种方法来做同样的事情。
3 回答
- 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
.
- 会话- 与 TempData 相同,只是它永不过期 - 它对所有请求都有效,而不是单个重定向。
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 );
}
查看数据:
- 是继承自的特殊字典
ViewDataDictionary
。 - 用于将数据从控制器发送到视图。
- 它的生命周期是当前的请求。
- 如果你有它会被销毁
Redirect
。 - 出于安全原因,最好
null
在使用前检查它。 - 应为操作进行铸造。
查看包:
是动态类型(此类型在 c#4 中呈现)。
Like
ViewData
用于将数据从控制器发送到视图。- 其值在当前请求中的有效期。
- 在页面之间的重定向中,其值为空。
- 使用前出于安全原因,请检查
null
. - 铸造不是必需的,所以它比
ViewData
.
临时数据:
- 一种特殊的字典,源自
TempDataDictionary
. - 它的生命周期很短,用于在页面之间发送信息(
Redirect
)。 - 完全渲染
View
后,其值为null
. - 使用前出于安全原因,请检查
null
. - 应为操作进行铸造。
会议:
- 用于在不同请求之间发送信息。
- 它的值不是
null
非空值;除非经过一段时间(session expire
)。 - 使用前出于安全原因,请检查
null
. - 应为操作进行铸造。
本文解释了 ViewData、ViewBag 和 TempData 之间的区别。我希望你可以参考这篇文章来满足你的需要。