【问题标题】:Is ViewState relevant in ASP.NET MVC?ViewState 在 ASP.NET MVC 中是否相关?
【发布时间】:2009-07-23 09:48:17
【问题描述】:

我正在学习 ASP.NET MVC,“ASP.NET”的许多概念,如身份验证、授权、会话状态仍然适用于它。

但是从我所了解的一点点来看,我认为 ViewState 在 ASP.NET 应用程序中仍然不相关。但它就在那里(System.Web.Mvc.ViewPage 的属性)!它只是出于兼容性原因还是仍有一些用途/用途?

【问题讨论】:

  • 这种问题我觉得很有用。我现在没有使用 ASP.NET MVC,因为我目前根本没有做 web 的东西,但我仍然想知道它,这样我在使用它时可以更快地掌握它。

标签: .net asp.net asp.net-mvc viewstate


【解决方案1】:

是的,没错。 ViewState 不相关。有关页面模型和 MVC 之间差异的更多信息,请点击此处:

Compatibility of ASP.NET Web Forms and ASP.NET MVC

【讨论】:

    【解决方案2】:

    它的存在是因为 ViewPage 继承自 Page。然而,Page 本身对 WebControls 使用的 ViewState 没有用处。可以在视图中包含原始 WebControl,但这样做会完全失去将控件与视图分离的意义。

    【讨论】:

    • 你的推理是正确的,但我选择接受另一个答案,因为它的答案很果断!
    【解决方案3】:

    ViewState 不相关,但它提供了一些很棒的功能。我们不必每次都重新加载数据,或者担心缓存每个项目等。 ViewState 还提供了一些安全性——它防止了一定程度的表单篡改。如果您绑定了一个组合框,它会阻止人们摆弄这些值,因为这些值与散列视图状态进行比较,并且如果它被弄乱了,验证将失败。为此,ViewState 非常好。问题是它在大多数页面上变得非常大,因为人们没有关闭他们不需要的视图状态。

    好的 - 如何解决这个问题? Microsoft 的 MVC Futures 项目包含 Html.Serialize 方法,并结合 [Deserialize] 属性作为方法参数,这提供了对“视图状态”的非常精细的控制 - 即序列化。

    例如。在控制器中:

    [HttpGet] 公共行动结果索引() { OrderRepository 存储库 = new OrderRepository(); var shipTypes = repository.GetAllShipTypes(); var orders = repository.GetAllOrders(); ViewBag.ShipTypes = shipTypes; 返回视图(orders.First()); } [HttpPost] public ActionResult Index(Order order, [Deserialize] List shipTypes) { //注意 order.ShipTypeId 已填充。 ViewBag.ShipTypes = shipTypes; 返回视图(); }

    在视图中,我将其序列化并组合使用它

    @Html.Serialize("ShipTypes", ViewData["ShipTypes"]) @Html.DropDownList("ShipTypeId", ((List)ViewData["ShipTypes"]).ToSelectList("ShipTypeId", "Description"), new { @class= "combobox11" })

    【讨论】:

    • FWIW,目前我的偏好是缓存这些数据而不是存储在页面上,但这是作为一个选项提供的,尤其是在将 Web 表单应用程序移植到 mvc 并且需要重新设计完整页面时'不可用。
    【解决方案4】:

    我个人认为它已经过时了。我在 ASP.Net MVC 应用程序中看到 ViewState 的唯一一次是有人“不小心”将 ASP.Net 控件添加到页面。

    【讨论】:

    • 我收到了您的消息,但由于 ASP.NET Web 表单并没有过时,ViewState 也没有过时。它只是不被 ASP.NET MVC 使用!
    • 在asp.net mvc中可以模拟视图状态
    【解决方案5】:

    如果需要,您可以使用MVC3Futures project 模拟视图状态。它可以让您将整个模型保存在视图中。

    您所要做的就是序列化模型并在视图中对其进行加密。

    @Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned)
    

    并在控制器中添加反序列化属性。

    public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)
    

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多