关于ASP.NET MVC 3:ViewBag / ViewData生命周期

ViewBag/ViewData Lifecycle

我已经看到许多关于何时使用ViewBag / ViewData与ViewModel的文章,但我无法找到有关ViewBag生命周期的解释。

例如,我在一个Controller中有两个Action方法:

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

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

如果我在GET操作方法的ViewBag中放置一些值以设置一些Form标签,则当他们用户单击"提交"按钮并且Form通过HTTP POST回发到服务器时,ViewBag值不再位于 POST操作方法。

有人可以解释一下ViewBag / ViewData的生命周期(或提供其参考)吗?


您放入ViewBag / ViewData中的数据仅在填充它的请求的生命周期内可用。 MVC没有回发。如果您需要一些东西来保留一个以上的请求,则应使用Session。

这是一篇关于ViewData,ViewBag和TempData之间差异的体面文章:http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications


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

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

生命周期似乎是:

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

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

从控制器到视图的切换过程中,后面有一个有趣的步骤,其中"如果页面具有ViewData,则设置ViewData"。 ViewData在此之前显然可用,因此set并不意味着实例化。相反,它似乎意味着它已从Controller(记住这对View不可用)传输到ViewContext(提供对ViewBag / ViewData和Model的View访问权限的容器)。

ViewData可能与其余的View同时处理。

还需要注意的是,MVC视图是从内向外渲染的,因此特定的视图及其对ViewBag所做的任何分配都将按照从内到外的顺序进行。这意味着在"视图"子页面上设置的内容将可用于布局,但是将某些内容添加到"布局"中的ViewBag,然后在"视图"子页面中读取它将会失败。


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

所以这些/这是给定视图的字典。您在操作中设置其值,然后在视图中使用它。正如扎克(Zach)所说,它不会再接再来的请求。您可以将其值作为形式字段,查询字符串等形式发送回任何给定的操作,但是这些值将不会自动用作VieBag的属性。


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

  • ViewDataViewData是对象的字典,它们是
    可通过字符串作为键访问。
  • ViewBag:使用动态功能。它允许一个对象添加
    动态属性。