5

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

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

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

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

我的问题不是关于性能,而是关于策略。我决定将属性置于视图状态中的标准是什么?我在想一些事情:

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

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

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

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

4

3 回答 3

4

用于ViewState控件工作不需要的东西。

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

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

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

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

控制状态与视图状态示例

于 2012-08-31T14:50:51.657 回答
3

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

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

视图状态摘录:

查看状态

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

当页面回发给自身时,您可以使用视图状态在往返过程中存储您自己的页面特定值。例如,如果您的应用程序正在维护特定于用户的信息(即在页面中使用但不一定是任何控件的一部分的信息),您可以将其存储在视图状态中。

使用视图状态的优点是:

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

简单实现视图状态不需要任何自定义编程即可使用。默认情况下,维护控件的状态数据是打开的。

增强的安全功能 视图状态中的值经过散列、压缩和编码以用于 Unicode 实现,这提供了比使用隐藏字段更高的安全性。

使用视图状态的缺点是:

性能注意事项 因为视图状态存储在页面本身中,所以存储较大的值会导致页面在用户显示和发布时变慢。这对于带宽通常是限制的移动设备尤其重要。

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

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

于 2012-08-31T14:55:51.917 回答
0

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

于 2012-08-31T14:50:02.653 回答