我正在编辑一个项目,我看到一个会话[“”]在一个控制器方法和TempData [“”]在另一个。 4之间有什么区别或者它只是4种方式做同样的事情。
解决方法
> ViewData / ViewBag – 仅在当前请求的持续时间内有效。您在控制器操作中设置它,并在视图中使用它,然后它消失。区别是第一个是字典,第二个只是这个字典的一个动态包装。两者指向相同的数据。 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(); }
ASP.NET MVC将自动使存储在TempData中的值在您读取后过期。下面的ASP.NET MVC将信息持久化到Session中。
> Session – 与TempData相同,除了它永不过期 – 它将对所有请求有效,而不是单个重定向。