【问题标题】:How do I decide what to store in viewstate?我如何决定在视图状态中存储什么?
【发布时间】:2012-08-31 14:47:06
【问题描述】:

我一直在编写一堆通用的 ASP.NET 控件,但我似乎无法理解的一件事是何时将值存储在视图状态中,以及何时假定不存储是可以的。

一方面,将控件的整个状态存储在视图状态中是有意义的,包括以下属性:

  • 用户输入的文本框值(或任何表单数据)
  • 高度或页面大小等配置选项
  • 甚至控件的组成方式 - 例如存储构建网格视图的所有数据,或网格本身。

忽略性能,您可以在视图状态中推动的越多越好,因为这意味着控件在回发中的行为将完全相同,并且永远不会“意外”恢复值或“忘记”它被禁用。但是视图状态不是免费的。存储所有内容意味着控件现在将输出 HTML 及其所有内部属性以创建该 HTML,这几乎总是输出的两倍以上。

我的问题不是关于性能,而是关于策略。 我决定将属性置于视图状态中的标准是什么?我在考虑以下几点:

如果用户不能更改属性,那么服务器将始终显式设置它,因此可以将其置于视图状态之外。即使对于像color=red 这样的东西,用户也不会直接设置这个属性;他们将单击其他地方的按钮,间接设置此属性。该按钮或其所有者应保持状态,而不是呈现红色的控件。

这个逻辑意味着应该进入视图状态的唯一属性是:

  1. <input> 等表单元素(使用 Request.Form[c.UniqueID] 仍然可以避免这种情况)
  2. 用户可以直接在控件上以交互方式控制的属性。

这个逻辑有意义吗?它似乎很弱,我想听听专家的更多信息。

【问题讨论】:

标签: asp.net viewstate


【解决方案1】:

ViewState 用于您的控件不需要的操作。

ControlState 用于您的控件工作所必需的内容,即使 ViewState 被禁用。

当第一次请求页面时,初始值和控件层次结构(甚至是 html 控件)被编译到临时 ASP.NET 文件中。因此,当它们从未更改时,它们不需要存储在任何地方(甚至 ViewState 也不会保存它们)。

控件仅将属性存储在ViewState 中,这些属性在页面的生命周期(自TrackViewState 起)期间发生了更改。更改状态的控件是“脏”的。例如,如果您在 page_load 中更改 TextBox1.TextViewState.IsItemDirty("TextBox1.Text") 将返回 true。这些值将存储在 ViewState 中。

看看herehere。 (我真的建议阅读这两篇文章)

Control State vs. View State Example

【讨论】:

    【解决方案2】:

    查看 MSDN 上的这篇文章,介绍何时、何地以及如何使用 ASP.NET 中提供的大量状态管理选项,为方便起见,将视图状态部分发布在下面 - 检查您的要求与优缺点应该可以指导您使用根据具体情况:

    全文在这里:http://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx

    视图状态摘录:

    查看状态

    Web 表单页面提供 ViewState 属性作为内置结构 用于在多个请求之间自动保留值 同一页。视图状态作为页面中的隐藏字段进行维护。为了 更多信息,请参阅 ASP.NET 状态管理概述。

    您可以使用视图状态来存储您自己的页面特定值 页面回发到自身时的往返。例如,如果您的 应用程序正在维护用户特定的信息——也就是说, 页面中使用但不一定是其中一部分的信息 任何控件 - 您可以将其存储在视图状态中。

    使用视图状态的优点是:

    不需要服务器资源视图状态包含在 页面代码中的结构。

    简单实现视图状态不需要任何自定义 编程使用。默认情况下保持状态数据处于打开状态 控制。

    增强的安全功能视图状态中的值是散列的, 为 Unicode 实现压缩和编码,它提供 比使用隐藏字段更安全。

    使用视图状态的缺点是:

    性能考虑因为视图状态存储在 页面本身,存储较大的值会导致页面变慢 用户显示它以及何时发布它。这尤其重要 对于移动设备,带宽通常是一个限制。

    设备限制 移动设备可能没有内存容量 存储大量的视图状态数据。

    潜在的安全风险视图状态存储在一个或多个 页面上的隐藏字段。尽管视图状态将数据存储在散列中 格式,它仍然可以被篡改。隐藏的信息 如果直接查看页面输出源可以看到字段, 造成潜在的安全问题。有关详细信息,请参阅 ASP.NET Web 应用程序安全和 Web 的基本安全实践 应用程序。

    【讨论】:

      【解决方案3】:

      我认为您担心视图状态膨胀是正确的,但您还有哪些其他选择?如果你不在那里存储你的变量数据,你会把它放在哪里? (您可能希望考虑删除一些配置项——也许不要让用户更改这么多属性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 2010-12-03
        • 2013-09-09
        • 2011-10-24
        相关资源
        最近更新 更多