C#中PostBack会保留的内容

本文探讨了ASP.NET中视图状态的工作原理及其如何影响页面控件的行为,尤其是在PostBack事件中的表现。文章详细解释了为何某些控件的内容在PostBack后仍然存在而有些则消失,并提供了通过调整ViewStateMode属性来优化页面性能的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在研究什么时候用 if (!IsPostBack)的时候。有个控件,里面包含了用Repeater绑定了一系列信息,也有用<%=jglx%>输出一些信息,然后把把绑定Repeater的事件就放在if (!IsPostBack)方法里面。也把直接输出的<%=jglx%>的赋值也写在if (!IsPostBack)方法里,就像以下:
if (!IsPostBack){
    Repeater1.DataBind();
    jglx="信息";

之后发现在发生PostBack事件(例如:UpdatePanal中ajax回传,点击搜索,AjAx分页中点击下一页)Repeater中的内容正常输出,<%=jglx%>就没有了内容。

参考微软的官方说明:发现有一个概念叫做“视图状态”(http://msdn.microsoft.com/zh-cn/library/bb386448.aspx)会保留回发过程中值,前提是该控件是放在了一个加了 具有 runat="server" 特性的 form 元素中。而且“视图状态”保留的内容都是有runat="server"的服务器控件。像Repeater,Chart,GridView(有可能是vs中数据一栏中所有的控件),因为这一类控件并不像input框那样可以作为一个存储数据的容器,所以就用“视图状态”把他们的值存起来,如果打开一个aspx页面的源代码,你就可以看见一个紧接着form那个地方有一个隐藏控件形如:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=""/>;value中有一长串字符,根据微软的解释就是把 '视图状态"中的值经过转换成XML格式之后再用base64去编码后形成的,你可以把value中的内容在粘贴站:http://maclife.net/tools/base64/中去进行转换,就可以看到一些内容了。
正因为Repeater的内容放在了“视图状态”中,所以我们可以通过设置控件的 ViewStateMode="Disabled" 属性去让页面不保存该控件的值,你可以尝试在设置一下,然后在PostBack事件回传的页面中,Repeater控件的内容就会像<%=jglx%>那样消失不见了。默认的是ViewStateMode是开启状态的。

那服务器端的input框(加了runat="server"的),按照我得理解应该算是”控件状态“了(具体有多少种状态可以在:http://msdn.microsoft.com/zh-cn/library/75x4ha6s中查看),因为设置其ViewStateMode="Disabled"的是时候对其没有影响。

现在就知道 大概有那些个方法可以通过放在if (!IsPostBack)中去提高效率了,至少用DataBound()事件去绑定数据的控件的的方法应该是放在其中的。

而且也知道那些应该设置为ViewStateMode="Disabled"以减少PostBack回发所需传送的数据了:至少分页中的内容是需要设置为ViewStateMode="Disabled"的,因为每一次分页之后绑定的数据都是不一样的,没有必要把变化的数据也保存起来,我试了一下,把分页的数据设置为ViewStateMode="Disabled"之后<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=""/>中存储的值居然少了4K,那么在用UpdatePanal做分页的时候,AjAx发送回服务器的数据和从服务器中传回来的数据,加起来就是2个4K了

 

经测试:在<asp:Label 和 <asp:Button控件中放置的动态内容既不会作为“视图状态”存放在<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=""/>中,也不会像<input runat="server"那样被保存起来,他的值任何时候都是会丢失的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值