【问题标题】:Relation between postback and viewstate (datagrid)回发和视图状态(数据网格)之间的关系
【发布时间】:2012-09-10 11:26:46
【问题描述】:
在这篇文章http://www.devx.com/vb2themax/Tip/18714“使用 EnableViewState 属性提高性能”中,我看不到他们在哪里将 EnableViewState 设置为 false。他们只是这样做
If Not Me.IsPostBack() Then
...
DataGrid1.DataBind()
Postback 和 ViewState 一样吗?
为什么不在数据网格控件上做 EnableViewState = false ?
【问题讨论】:
标签:
asp.net
gridview
postback
viewstate
【解决方案1】:
文章明确指出,第一个示例(您要退出的部分)通常在启用“ViewState”的情况下完成。由于只有第一个 get-request 需要将网格绑定到数据源 (IF Not Me.IsPostBack()),因为连续的回发会从保存的 ViewState 中恢复网格数据。
Page_Load 方法的第二个示例假定 ViewState 在 .aspx 文件中已被禁用,并在每次加载页面时将网格绑定到数据源。
对Me.IsPostBack 的调用仅检查表单是否通过http post 访问,而ViewState 是一个对象,它保存与ASP.NET 服务器控件的可视化表示有关的所有信息。所以,不,它们不一样!
【解决方案2】:
网格控件充当许多控件的容器。每个控件都在 ViewState 中存储了大量信息。
ViewState 默认存储在隐藏控件中。这意味着它会在每个页面请求上发送到客户端。为避免这种开销,您可以将 EnableViewState 设置为 false。
<asp:GridView ID="GridView1" runat="server" EnableViewState="false">
ViewState 和 PostBack 是两个完全不相关的实体。 ViewState 存储控件想要保留的任何信息。 PostBack 仅指用户将信息发送回页面。
不过,ViewState 对于记住用户在上次 PostBack 中输入的值也非常有用。如果您的 ViewState 非常大,并且您不想将其发送给用户,请考虑将其保存在 Session 中。您可以通过将 PageStatePersister 设置为 SessionPageStatePersister
来做到这一点
SessionPageStatePersister 利用与
用于存储数据的浏览器会话。使用会话而不是
隐藏字段避免了发送到的页面大小的增加和
从浏览器。在许多情况下,页面状态很重要
整体标记的一部分。但是,将此数据存储在会话中
消耗宝贵的服务器资源。