我一直在编写一堆通用的ASP.NET控件,而我似乎无法理解的一件事是什么时候在viewstate中存储值,何时假设它没有。
一方面,将控件的整个状态存储在viewstate中是有意义的,包括以下属性:
忽略性能,你在视图状态中推得越多越好,因为这意味着控件在回发中的行为完全相同,并且从不“意外地”还原值或“忘记”它被禁用。但观点不是免费的。存储一切意味着控件现在将输出HTML及其所有内部属性来创建HTML,这几乎总是使输出翻倍。
我的问题不是关于绩效,而是关于战略。 我决定将一个属性放在viewstate中的标准是什么?我正在考虑这些问题:
如果用户无法更改属性,则服务器将始终显式设置,因此可以将其保留在viewstate之外。即使像
color=red
这样的东西,用户也不会直接设置此属性;他们会点击其他地方的按钮,间接设置此属性。该按钮或其所有者应保持状态,而不是使颜色呈现红色的控件。
这个逻辑意味着应该进入viewstate的唯一属性是:
<input>
(以及Request.Form[c.UniqueID]
,这可以避免)这种逻辑有意义吗?这似乎很弱,我想听听专家的更多信息。
答案 0 :(得分:4)
将ViewState
用于您的控件无需工作的内容。
即使禁用了ViewState,也可以使用ControlState
来控制您的控件所需的内容。
首次请求页面时,初始值和控件层次结构(甚至是html控件)将编译到临时ASP.NET文件中。因此,当它们永远不会被更改时,它们不需要存储在任何地方(甚至ViewState也不会保存它们)。
控件仅存储ViewState
中在页面生命周期期间发生更改的属性(自TrackViewState
起)。状态改变的控件是“脏”的。例如,如果您在page_load中更改TextBox1.Text
,则ViewState.IsItemDirty("TextBox1.Text")
将返回true。这些值将存储在ViewState中。
答案 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膨胀是正确的,但你还有其他选择吗?如果你不在那里存储你的可变数据,你会把它放在哪里? (您可能希望考虑删除一些配置项 - 也许不允许用户更改这么多属性)。