在研究什么时候用 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"那样被保存起来,他的值任何时候都是会丢失的。