Asp.NET 2.0 Callback無法讀到其他input現值問題與解決方式
問題
之前有在MSDN論談上問Asp.NET 2.0 Callback在Server端有辦法讀到其他欄位的Current的值嗎?
因為筆者在之前在asp.net 1.1中的程式有用了大量的Callback,移植到了asp.net 2.0時,就發現了這個問題!造成筆者很大的困擾,因為原本在1.1中用的好好的,到了2.0就有這問題,導致很多方式都改成了用Postback的方式,不過,因為實在有太多東西還是要用Callback,所以再研究下去,最後終於發現了問題所在!
請看以下圖1~3。
解決方式
看到了圖3,就發現2.0的Callback讀到的值都是Server Render到Client的值,當Client去改變Textbox的值而不postback時,這時callback到Server端讀到的就還會是舊的值。
解法1,
就是把那些要在Server端讀取的Textbox設定AutoPostback="true",這樣當我按下「比較A&B」的Button就可以讀到正確的txtA的值了。 不過,這樣好像粉瞎哦!
想了一下,當我按下「比較A&B」的Button時,它到底做了那些事呢?
看了上圖(圖4)後發現它是Call WebForm_DoCallback這個function,所以就再看這個function裡面在做什麼?
裡面__theFormPostData這個變數是那裡指定的呢? 再往下看下去,原來是在WebForm_InitCallbackAddField function中有用到 ,那誰用到WebForm_InitCallbackAddField這個function呢? 是在WebForm_InitCallback function之中。
看了WebForm_InitCallback這個function的內容後,發現它是在組Client各input的值,然後放在__theFormPostData中,然後給WebForm_DoCallback去callback到Server,那又是誰來Call它的呢?
找了一下,檢視原始檔就發現以下的Code,
謎題解開了,原來是頁面一Render出來就Run了,難怪取不到後來User改的值。
解法2,
新增一個JS File(如範例CustCallback.js),然後覆寫WebForm_DoCallback這個Function,然後在最前面清掉__theFormPostData的值,再呼叫WebForm_InitCallback這個function, 然後把這個JS File(CustCallback.js)加入到頁面之中,如範例CustCallBack.aspx。這樣就可以在每次Callback時,在Server端取到了畫面上最新的值了!
附件測試程式(Default.aspx是使用原生的Callback, CustCallBack.aspx是有引用客制化過的Js),
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^