我一直在写一大堆通用的ASP.NET控件,而我似乎无法想到的一件事是什么时候将值存储在viewstate中,以及何时假设它不会。如何决定在视图状态下存储什么?
一方面,是有意义的存储在视图状态的控制的整个状态,包括像属性:由用户输入
- 文本框的值(或任何形式的数据)
- 配置选项如高度或页面大小
- 即使是如何组成控件 - 例如存储构建网格视图的所有数据,或者网格本身。
忽略性能,更可以在视图状态推越好,因为这意味着该控件的行为方式完全一样在回发,从来没有“意外”还原值或“忘记”它被禁用。但视图状态不是免费的。存储所有内容意味着控件现在将输出HTML及其所有内部属性来创建该HTML,这几乎总是输出的两倍多。
我的问题不是性能,而是战略。 我决定在视图中放置一个属性的标准是什么?我正沿着这些路线思考的东西:
如果用户不能更改属性,那么服务器会一直把它明确,所以它的确定离开它的视图状态。即使对于类似
color=red
的用户,用户也不会直接设置此属性;他们会在其他地方点击一个按钮来间接设置这个属性。该按钮或其所有者应保持该状态,而不是使该颜色呈现红色的控件。
这种逻辑意味着应该进入的视图状态的唯一特性是:
- 表单元素
<input>
(与Request.Form[c.UniqueID]
这可仍然避免) - 属性,用户可以控制交互式地直接控制。
这是否逻辑是否合理?它似乎很弱,我想听到更多的专家。
另外:http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx是一个有趣的阅读 – Patrick