2012-08-31 28 views
5

我一直在写一大堆通用的ASP.NET控件,而我似乎无法想到的一件事是什么时候将值存储在viewstate中,以及何时假设它不会。如何决定在视图状态下存储什么?

一方面,是有意义的存储在视图状态的控制的整个状态,包括像属性:由用户输入

  • 文本框的值(或任何形式的数据)
  • 配置选项如高度或页面大小
  • 即使是如何组成控件 - 例如存储构建网格视图的所有数据,或者网格本身。

忽略性能,更可以在视图状态推越好,因为这意味着该控件的行为方式完全一样在回发,从来没有“意外”还原值或“忘记”它被禁用。但视图状态不是免费的。存储所有内容意味着控件现在将输出HTML及其所有内部属性来创建该HTML,这几乎总是输出的两倍多。

我的问题不是性能,而是战略。 我决定在视图中放置一个属性的标准是什么?我正沿着这些路线思考的东西:

如果用户不能更改属性,那么服务器会一直把它明确,所以它的确定离开它的视图状态。即使对于类似color=red的用户,用户也不会直接设置此属性;他们会在其他地方点击一个按钮来间接设置这个属性。该按钮或其所有者应保持该状态,而不是使该颜色呈现红色的控件。

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

  1. 表单元素<input>(与Request.Form[c.UniqueID]这可仍然避免)
  2. 属性,用户可以控制交互式地直接控制。

这是否逻辑是否合理?它似乎很弱,我想听到更多的专家。

+1

另外:http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx是一个有趣的阅读 – Patrick

回答

4

使用ViewState的事情上是没有必要为您的控制工作。

使用ControlState的事情上需要为您的控制工作,即使ViewState中是禁用的。

的初始值和控制体系(甚至HTML的控件)被编译成临时ASP.NET文件时,第一次请求的页面。所以他们不需要存储在任何地方,甚至不会保存它们(甚至ViewState也不会保存)。

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

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

Control State vs. View State Example

0

我想你是对被关注的视图状态膨胀,但其他选项提供给您?如果你不存储你的变量数据,你会在哪里放置它? (您可能希望考虑删除一些配置项 - 可能不会让用户更改这么多的属性)。

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的基本安全措施 应用程序。

相关问题