我一直在编写一堆通用的 ASP.NET 控件,而我似乎无法理解的一件事是何时将值存储在视图状态中,以及何时假设不存储是可以的。
一方面,将控件的整个状态存储在视图状态中是有意义的,包括以下属性:
- 用户输入的文本框值(或任何表单数据)
- 高度或页面大小等配置选项
- 甚至控件是如何组成的——例如存储构建网格视图的所有数据,或者网格本身。
忽略性能,你可以在视图状态中推动的越多越好,因为这意味着控件在回发中的行为将完全相同,并且永远不会“意外”恢复一个值或“忘记”它被禁用。但是视图状态不是免费的。存储所有内容意味着控件现在将输出 HTML 及其所有内部属性以创建该 HTML,这几乎总是输出的两倍以上。
我的问题不是关于性能,而是关于策略。我决定将属性置于视图状态中的标准是什么?我在想一些事情:
如果用户无法更改属性,那么服务器将始终显式设置它,因此可以将其置于视图状态之外。即使对于类似的东西
color=red
,用户也不会直接设置此属性;他们将单击其他地方的按钮,间接设置此属性。该按钮或其所有者应保持状态,而不是呈现红色的控件。
这个逻辑意味着应该进入视图状态的唯一属性是:
- 像这样的表单元素
<input>
(并且Request.Form[c.UniqueID]
仍然可以避免) - 用户可以直接在控件上以交互方式控制的属性。
这个逻辑有意义吗?它似乎很弱,我想听听专家的更多信息。