ViewBag/ViewData 生命周期

40

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

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

// 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个回答

42

谢谢您的回复。我已经阅读了那篇文章,但它并没有涉及到 ViewBag/ViewData 的生命周期,只是稍微提到了 TempData。为了澄清事情,我所说的“Post Back”只是指用户提交表单,从而引发一个 HTTP POST 请求,然后由控制器的适当操作方法来处理。 - JTech
1
该文章确实指出:“但是,一旦控制器重定向,ViewBag和ViewData将包含null值。” 她没有明确表示ViewBag和ViewData的生命周期在请求完成后结束,但她的确暗示了这一点。 - Zach Green

13
这里被接受的答案并没有真正描述ViewBag / ViewData的生命周期。不幸的是,似乎没有清晰的文档说明此事。但是,根据这个MVC页面生命周期的理解,生命周期为:IIS请求 ->路由 ->MVC处理程序 ->控制器(具有ViewData) ->视图(具有ViewData) ->处理程序返回对象池。 因此,ViewData(ViewBag包装的内容)实际上会在ControllerContext实例化时进行实例化,与TempData同时实例化。 这发生在第4步之后:MVC处理程序执行。稍后有一个有趣的步骤,即“如果页面具有ViewData,则设置ViewData”在从控制器移交给视图时。ViewData在此之前显然已经可用,因此设置不能意味着实例化。它似乎是指从控制器(记住View无法访问控制器)传输到ViewContext(提供View访问ViewBag / ViewData和Model的容器)。ViewData可能会与其他View一起被处理程序返回对象池处理。还要注意,MVC视图是从内向外渲染的,因此特定视图及其对ViewBag的任何分配也将按照由内到外的顺序发生。这意味着在View子页面上设置的内容将可用于布局,但从Layout中添加内容到ViewBag,然后在View子页面中读取它将失败。

2
来自MSDN - ViewBag: 动态视图数据字典(ViewDataDictionary), ViewData: 视图数据的字典。

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


0

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

  • ViewDataViewData是一个对象字典,可以通过字符串作为键来访问。
  • ViewBag:使用动态特性。它允许对象向其添加动态属性。

这不是真的。你为什么认为有两个呢?ViewBag 是视图本身的动态属性包,例如页面标题、本地化数据(如标签)等,如果您的控制器操作呈现不同的视图(如 Web/移动等),则可能会更改,并且应该允许用户切换语言。ViewData 是模型,即传递给视图以填充页面数据的数据,例如使用值填充输入控件或某些用户响应数据。 - Antony Booth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接