2012-03-12 55 views
12

WebForm中的ViewState和MVC中的ViewBag之间是否有功能差异?他们似乎是“同一件事”。并且可以以相同的方式使用。我问,因为MVC推动无状态网站,并没有填充页面中的数据造成膨胀和较慢的表现。但似乎你也可以在MVC中做到这一点。看起来,他们所做的只是给它一个新的名字。viewbag和viewstate之间的区别?

回答

6

ViewState在Web Forms中将表单数据序列化为表单中隐藏的加密字段,因此可以在回发中重新绑定数据。

ViewBag/ViewData是一个可以“填充”数据的字典。例如,你可以在你的Controller中添加它,然后在你的View中访问它。数据是dynamic,这使得难以处理数据。 ViewBag不会被发送到客户端,它是MVC(服务器管道)的一部分。

两者都应该避免。

ViewState by,好吧,不使用它并找到解决方法。而ViewBag应该通过使用ViewModel来避免。

+1

ViewBag有它的地方,例如使用DropDownList和传递选择列表。检查MVC脚手架CRUD - 它使用ViewBag。你的陈述太强烈了。也许,视图模型比ViewBag更适合。请参阅http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications – RickAndMSFT 2012-03-12 21:47:26

+1

@ Rick.Anderson-at-Microsoft.com - 同意我的声明可能会很强大,但不是DropDownList的情况。你的ViewModel可以(也应该)有一个'SelectList'的属性,它可以绑定到你的View中。绝对不需要ViewBag。 – RPM1984 2012-03-12 22:58:24

+0

SelectList代码由ASP.NET MVC工具生成,大多数人认为这是自动脚手架的正确选择。 – RickAndMSFT 2012-03-14 02:16:24

2

ViewBag不会发送到客户端(浏览器)。它纯粹是使用从控制器到View的转换(在将其发送回客户端之前)。

在MVC中,如果你从该页面得到回发,那么你不会恢复你的“状态”,就像Viewstate一样,你拥有的唯一状态是你发送给浏览器的任何内容,以及你发回的任何内容。

5

Viewstate随表单内容一起发布回服务器,因此在回发时可以使用它的值。一个viewbag只保存其中的值,直到页面被提供,然后从存储器中删除ViewBag。因此,您可以使用ViewState在呼叫之间保持状态,但不能对ViewBag执行相同的操作。

相关问题