上周知道的updatepanel,于是这个星期一直在使用和研究,下面是一个小小总结:
1)简单原理
上网找了找,觉得下面的解释比较好理解:当ScriptManager中允许页面局部更新时,它会以异步的方式回传给服务器,与传统的整页回传方式不同的是只有包含在UpdatePanel中的页面部分会被更新,在从服务端返回HTML之后,PageRequestManager会通过操作DOM对象来替换需要更新的代码片段。
2)按钮组件,或者提交代码组件在updatepanle里面:
不会更新页面,但是会提交结果,更新updatepanel中的内容。这里说明下,貌似页面所有的updatapanel都会更新。
1,如果更新内容在updatepanel内:刷新内容。
2,如果提交组件在updatepanel外:由于组件在updatepanel外,所以客户端页面不刷新内容;但是在服务器端已经执行了代码,所以更新组件在服务器端已经更新了内容。但是客户端却无法获取更新。
3)客户端更改了页面的内容: 不管是否在updatepanel,如果是label,更改了内容后,在服务器端没有变化。如果是textbox,在服务器端同时更新text。所以服务器端和客户端交互数据的时候,我觉得也可以用隐藏的textbox来进行。
4)如果有dropdownlist在这个updatepanel里面的话,如果是动态初始值的,那么提交数据后,无论如何也得不到真实的下拉选项,都只能得到默认的值。所以有下拉选框的时候,拿出来,不要放在updatepanel里面,动态赋值,同时不回传,这样才能在服务器端取到真实的值。同时,如果这个下拉框有数据源,在页面属性中配置其数据源,则即使放在updatepanel中,这个下拉框的真实选项仍然能被服务器识别。(真绕)
5)疑问:
如果提交组件在updatepanel内,页面局部更新。对于cs文件中的全局变量,有点不解。
在本次更新的时候,全局变量更改成功。但是下次别的组件(也在updatepanel中)取这个全局变量的时候,仍然是没有更新之前的。这样,就无法共同读取一个全局变量了。不知道怎么解决。
只能用viewstate来存储数据,而且不能放在全局变量中初始化。只能在page_load事件中或者函数中赋值,否则和全局变量一样有问题。而且这个不能页面间传值,只能用隐藏域传值