我正在编辑一个项目,我在一个控制器方法中看到了一个Session [“”],在另一个控制器方法中看到了TempData [“”]。 4之间是否存在差异,或者只是4种方法可以做同样的事情。
答案 0 :(得分:75)
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();
}
ASP.NET MVC会在您阅读后自动使TempData
中存储的值失效。 ASP.NET MVC将信息保存在Session
。
答案 1 :(得分:5)
ASP.net MVC引入了 ViewData,ViewBag,TempData,Session 来在控制器之间传递数据进行查看。
<强>的ViewData 强>
ViewData是使用存储在 CurrentRequestContext 中的 ViewDataDictionary 类实现的。因此,ViewData生命周期将在当前请求结束时结束。
ViewBag 也与ViewData类似,唯一的区别是它可以使用动态对象动态共享数据。
TempData 是一个非常短暂的实例,您只能在当前和后续请求期间使用它。这将是如果你想在ASP.net MVC中使用重定向(RedirectToAction,RedirectToRoute,Redirect)并在重定向之间传递一些数据,这样很方便。 TempData在Session中存储数据,但框架在当前和后续请求结束时处理数据。
会话是属于用户会话的长期(永不过期)数据。当您使用容易导致问题的会话变量时,您需要注意。
protected void Session_Start(Object sender, EventArgs e)
{
int userType = 1;
HttpContext.Current.Session.Add("_SessionUserType",userType );
}
答案 2 :(得分:4)
的ViewData:
ViewDataDictionary
继承的特殊字典。Redirect
,则会被销毁。null
。ViewBag:
是动态类型(此类型在c#4中显示)。
类似ViewData
用于将数据从控制器发送到视图。
null
。ViewData
更快。TempData的:
TempDataDictionary
。Redirect
)。View
后,其值将为null
。null
。会话:
null
不是空值;除非在一定时间后(session expire
)。null
。This文章解释了ViewData,ViewBag和TempData之间的区别。我希望你能根据自己的需要推荐这篇文章。