40

我看过很多关于何时使用 ViewBag/ViewData 与 ViewModel 的帖子,但我无法找到关于 ViewBag 生命周期的解释。

例如,我在一个控制器中有两个 Action 方法:

// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}

// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}

如果我在 GET 操作方法中的 ViewBag 中放置了一些值,以设置一些表单标签,那么当他们用户单击“提交”按钮并通过 HTTP POST 将表单回发到服务器时,ViewBag 值不再包含在POST 操作方法。

有人可以解释(或提供好文章的参考) ViewBag/ViewData 的生命周期吗?

4

4 回答 4

42

您放入 ViewBag/ViewData 的数据仅在您填充它的请求的生命周期内可用。MVC 没有回发。如果你需要在多个请求中持久化,你应该使用 Session。

这是一篇关于 ViewData、ViewBag 和 TempData 之间区别的不错的文章:http: //rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

于 2012-02-08T02:01:02.340 回答
12

这里接受的答案并没有真正描述 ViewBag/ViewData 的生命周期。不幸的是,似乎没有关于此的明确文档。但是,基于此:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

似乎生命周期是:

IIS 请求 -> 路由 -> MVC 处理程序 -> 控制器(带有 ViewData)-> 视图(带有 ViewData)-> 处置

因此,ViewData(ViewBag 简单地包装)实际上将使用 ControllerContext 实例化,同时实例化 TempData。这发生在步骤 4:MVC 处理程序执行之后的几个步骤。

后面有一个有趣的步骤,在从 Controller 到 View 的切换期间“如果页面有 ViewData,则设置 ViewData”。ViewData 在此之前显然是可用的,因此 set 不能意味着实例化。相反,它似乎意味着它从控制器(记住对视图不可用)传输到 ViewContext(提供视图访问 ViewBag/ViewData 和模型的容器)。

ViewData 可能与 View 的其余部分同时被处理掉。

还需要注意的是,MVC 视图是从内向外呈现的,因此特定的视图和它对 ViewBag 所做的任何分配都将按照从内到外的顺序同样发生。这意味着在 View 子页面上设置的内容将可用于 Layout,但在 Layout 中向 ViewBag 添加内容然后在 View 子页面中读取它会失败。

于 2014-01-28T04:25:28.313 回答
2

来自MSDN - ViewBag:动态视图数据字典,ViewData:视图数据字典。

所以这些/这是给定视图的字典。您在您的操作中设置它的值并在您的视图中使用它。正如 Zach 所说,它不会在随后的请求中返回。您可以将其值作为表单字段、查询字符串等形式发送回任何给定的操作,但这些值不会自动作为 VieBag 的属性提供。

于 2012-02-08T03:41:35.247 回答
0

ViewBagViewData用于相同目的。它们用于将数据从控制器传递到视图。当我们为它们分配任何数据或对象时,它们可以在视图中访问。

  • ViewData: ViewData是一个对象字典,它们可以通过字符串作为键来访问。
  • ViewBag:使用动态功能。它允许对象向其添加动态属性。
于 2012-07-23T12:58:40.863 回答