如何决定在viewstate中存储什么?

时间:2012-08-31 14:47:07

标签: asp.net viewstate

我一直在编写一堆通用的ASP.NET控件,而我似乎无法理解的一件事是什么时候在viewstate中存储值,何时假设它没有。

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

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

忽略性能,你在视图状态中推得越多越好,因为这意味着控件在回发中的行为完全相同,并且从不“意外地”还原值或“忘记”它被禁用。但观点不是免费的。存储一切意味着控件现在将输出HTML及其所有内部属性来创建HTML,这几乎总是使输出翻倍。

我的问题不是关于绩效,而是关于战略。 我决定将一个属性放在viewstate中的标准是什么?我正在考虑这些问题:

  

如果用户无法更改属性,则服务器将始终显式设置,因此可以将其保留在viewstate之外。即使像color=red这样的东西,用户也不会直接设置此属性;他们会点击其他地方的按钮,间接设置此属性。该按钮或其所有者应保持状态,而不是使颜色呈现红色的控件。

这个逻辑意味着应该进入viewstate的唯一属性是:

  1. 表单元素如<input>(以及Request.Form[c.UniqueID],这可以避免)
  2. 用户可以直接在控件上以交互方式控制的属性。
  3. 这种逻辑有意义吗?这似乎很弱,我想听听专家的更多信息。

3 个答案:

答案 0 :(得分:4)

ViewState用于您的控件无需工作的内容。

即使禁用了ViewState,也可以使用ControlState来控制您的控件所需的内容。

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

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

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

Control State vs. View State Example

答案 1 :(得分:3)

在MSDN上查看这篇文章,了解ASP.NET中可用的多种状态管理选项的时间,地点和内容,以下是方便状态部分的发布 - 根据优缺点检查您的需求应指导您使用根据具体情况:

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

Viewstate摘录:

  

查看状态

     

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

     

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

     

使用视图状态的优点是:

     

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

     

简单实现View状态不需要任何自定义   编程使用。默认情况下,它打开以维护状态数据   控件。

     

增强的安全功能视图状态中的值经过哈希处理,   压缩,并为Unicode实现编码,提供   比使用隐藏字段更安全。

     

使用视图状态的缺点是:

     

性能注意事项因为视图状态存储在   页面本身,存储大值可能导致页面减速时   用户显示它以及何时发布它。这尤其重要   对于移动设备,带宽通常是一种限制。

     

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

     

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

答案 2 :(得分:0)

我认为你关注viewstate膨胀是正确的,但你还有其他选择吗?如果你不在那里存储你的可变数据,你会把它放在哪里? (您可能希望考虑删除一些配置项 - 也许不允许用户更改这么多属性)。