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的属性。
-
ViewData :ViewData 是对象的字典,它们是
可通过字符串作为键访问。 -
ViewBag :使用动态功能。它允许一个对象添加
动态属性。