【问题标题】:Difference between viewbag and viewstate?viewbag 和 viewstate 的区别?
【发布时间】:2012-03-28 12:06:20
【问题描述】:

Webforms 中的 ViewState 和 MVC 中的 ViewBag 在功能上有区别吗?它们似乎是“同一件事”。并且可以以相同的方式使用。我问是因为 MVC 促进了无状态 Web,而不是在页面中填充数据导致膨胀和性能下降。但似乎你也可以在 MVC 中做到这一点。他们所做的似乎只是给它一个新名字。

【问题讨论】:

    标签: asp.net-mvc webforms viewstate viewbag


    【解决方案1】:
    Web Forms 中的

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

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

    两者都应该避免。

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

    【讨论】:

    • ViewBag 有它的位置,例如使用 DropDownList 和传递选择列表。检查 MVC Scaffolded CRUD - 它使用 ViewBag。你的说法太强了。也许,在适当的时候,视图模型比 ViewBag 更受欢迎。见rachelappel.com/…
    • @Rick.Anderson-at-Microsoft.com - 同意我的陈述可能很强烈,但在 DropDownList 的情况下则不然。你的 ViewModel 可以(并且应该)有一个SelectList 的属性,它可以绑定到你的视图中。那里绝对不需要 ViewBag。
    • SelectList 代码由 ASP.NET MVC 工具生成,大多数人认为这是自动脚手架的正确选择。
    • @Rick.Anderson-at-Microsoft.com - 在许多方面,脚手架是一个示例,当然并不总是最佳实践。猜猜我们必须同意不同意。
    【解决方案2】:

    Viewstate 与表单的内容一起回发到服务器,因此其中的值在回发时可用。 viewbag 只保存其中的值,直到页面被提供,然后 ViewBag 从内存中删除。所以你可以使用 ViewState 来保持调用之间的状态,但你不能对 ViewBag 做同样的事情。

    【讨论】:

      【解决方案3】:

      ViewBag 不会发送到客户端(浏览器)。它纯粹是用来从控制器转换到视图(在它发送回客户端之前)。

      在 MVC 中,如果您从该页面获得回发,那么您将无法恢复您的“状态”,就像 Viewstate 所做的那样,您拥有的唯一状态是您发送到浏览器的任何内容,以及您发回的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2013-08-07
        相关资源
        最近更新 更多