2012-02-08 72 views
34

我见过很多关于何时使用ViewBag/ViewData vs ViewModel的文章,但我一直无法找到ViewBag生命周期的解释。ViewBag/ViewData生命周期

例如,我有一个控制器2种action方法:

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

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

如果我把一些值在ViewBag在GET操作方法,建立某种形式标签,然后当用户单击“提交”按钮并通过HTTP POST将表单发送回服务器时,ViewBag值不再位于POST操作方法中。

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

回答

35

您在ViewBag/ViewData中放入的数据仅在填充它的请求的生命周期中可用。 MVC没有发布帖子。如果你需要一些东西来坚持多个请求,你应该使用会话。

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

+0

感谢您的回复。我已经阅读过这篇文章,并没有涉及ViewBag/ViewData的生命周期,但是对TempData略有介绍。为了解决这些问题,'Post Back'我的意思是用户提交一个FORM,从而导致一个HTTP POST请求,然后由一个Controllers适当的Action方法处理。 – JTech 2012-02-08 02:19:18

+1

该文章的状态为“但是,一旦控制器重定向,ViewBag和ViewData将包含空值。”正确的是,她没有具体说明ViewBag和ViewData的生命周期在请求完成后就结束了,但她的确暗示了它。 – 2012-02-08 02:27:09

2

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

所以这些/这是一个给定视图的字典。你在你的行为中设定它的价值,并在你的视野中使用它。正如扎克所说,随后的请求不会回来。您可以将其值返回给任何给定的动作作为表单字段,查询字符串等,但这些值不会自动作为VieBag的属性提供。

0

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

  • ViewDataViewData是对象的字典,他们是通过 字符串作为键访问。
  • ViewBag:使用动态特征。它允许一个对象为其添加 动态属性。
+0

这是不正确的。你为什么认为有2? ViewBag是视图本身的一个动态属性包,例如页面标题,本地化数据(如标签),如果您的控制器操作呈现不同视图(例如网页/手机等)并且用户需要切换语言,ViewBag可能会更改。 ViewData是模型,将数据传递给视图以用数据填充页面,例如使用值填充输入控件或某些用户响应数据。 – 2016-08-05 02:46:02

7

这里接受的答案并没有真正描述ViewBag/ViewData的生命周期。不幸的是,似乎没有关于这方面的明确文件。然而,在此基础上:

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

这似乎生命周期是:

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

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

在从控制器切换到查看过程中,后面有一个有趣的步骤,其中“如果页面具有ViewData,ViewData已设置”。 ViewData在此之前显然是可用的,所以设置并不意味着实例化。它似乎意味着它从Controller(记住不可用于View)转移到ViewContext(提供对ViewBag/ViewData和View的View访问的容器)中。

ViewData大概与视图的其余部分同时处置。

重要的是还要注意MVC Views从内到外呈现,因此特定View和它对ViewBag所做的任何分配同样会按照内部到外部的顺序发生。这意味着View子页面上设置的某些内容可用于Layout,但向Layout中的ViewBag添加内容然后在View子页面中阅读它将失败。