上週知道的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事件中或者函數中賦值,否則和全局變量一樣有問題。而且這個不能頁面間傳值,只能用隱藏域傳值