ViewBag/ViewData生命周期

JTe*_*ech 38 viewbag asp.net-mvc-3

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

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

// POST: /MyModel/Edit/5
[HttpPost]
public ActionResult Edit(MyModel _mymodel){}
Run Code Online (Sandbox Code Playgroud)

// GET: /MyModel/Edit/5
public ActionResult Edit(int id){}
Run Code Online (Sandbox Code Playgroud)

如果我在GET操作方法的ViewBag中放置一些值,设置一些表单标签,那么当用户单击"提交"按钮并通过HTTP POST将表单发回服务器时,ViewBag值不再在POST动作方法.

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

Zac*_*een 40

您放入ViewBag/ViewData的数据仅在您填充它的请求的生命周期内可用.MVC没有回发帖.如果您需要持续多个请求,则应使用Session.

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


Chr*_*ini 10

这里接受的答案并没有真正描述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子页面中读取它将失败.