我看过很多关于何时使用ViewBag / ViewData和ViewModel的帖子,但我无法找到ViewBag生命周期的解释。
例如,我在一个Controller中有两个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的生命周期吗?
答案 0 :(得分:38)
您放入ViewBag / ViewData的数据仅在您填充它的请求的生命周期内可用。 MVC没有回发帖。如果您需要在多个请求上保留某些内容,则应使用Session。
以下是一篇关于ViewData,ViewBag和TempData之间差异的文章:http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications
答案 1 :(得分:7)
此处接受的答案并未真正描述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处理程序执行。
后面有一个有趣的步骤,“如果Page具有ViewData,则在从Controller到View的切换期间设置了ViewData”。 ViewData在此之前显然是可用的,因此set不能表示实例化。它似乎意味着它从Controller(记住不可用于View)转移到ViewContext(提供对ViewBag / ViewData和Model的View访问的容器)。
ViewData可能与View的其余部分同时处理。
重要的是还要注意MVC视图是从内到外呈现的,因此特定的视图和它对ViewBag的任何分配也将按照从内到外的顺序进行。这意味着在View子页面上设置的内容将可用于布局,但是在布局中向ViewBag添加内容然后在View子页面中读取它将失败。
答案 2 :(得分:2)
From MSDN - ViewBag:动态视图数据字典,ViewData:视图数据的字典。
所以这些/这是给定视图的字典。您可以在操作中设置其值,并在视图中使用它。正如扎克所说,它不会随后的要求回来。您可以将其值作为表单字段,查询字符串等发送回任何给定的操作,但这些值不会自动作为VieBag的属性提供。
答案 3 :(得分:0)
ViewBag
和ViewData
用于同一目的。它们用于将数据从控制器传递到View。当我们为它们分配任何数据或对象时,可以在视图中访问它们。
ViewData
:ViewData
是对象的字典,它们是
可以通过字符串作为密钥访问。ViewBag
:使用动态功能。它允许添加对象
它的动态属性。