EventValidation (下)

2015年01月06日

作業題目:「來準備一個包含控制項的 GridView 吧!然後準備一個跟 GridView 的資料有相關的 TextBox,並將 TextBox 放置在 UpdatePanel 裡面,最後在 UpdatePanel 內外各放置一個按鈕;為了弄清楚 UpdatePanel 裡面的按鈕事件被觸發了幾次,再加上一個 Label 就好。」

小菜鳥的腦經挺直的,於是就寫成了這個樣子:

01_aspxCode

02_csCode

 

準備好之後,小菜鳥就按下F5──

 

小菜鳥:「Server、Server,我要 Defualt.aspx 這個頁面喔!」

Server 看了一下小菜鳥的 Request 申請書:「第一次申請喔?那這個給你。」

於是小菜鳥得到了這個東西:

03_PageStep1

 

小菜鳥看了看,將 TextBox 的值改為 1,然後丟給 Ajax:「 Ajax 快點幫忙~~我要按下這個 AjaxPostBack 按鈕,快點幫我跟 Server 講一下、更新頁面!」

Ajax:「人家想要睡覺說……」

不過 Ajax 跑去睡覺前,還是幫小菜鳥更新好頁面了。

04_PageStep2

 

小菜鳥搔搔頭,又把 TextBox 的值改為20,然後轉頭看了一下 Ajax ……好吧,Ajax 睡死了,小菜鳥只好自己去找 Server 。

小菜鳥:「Server、Server ~~我要按下 PostBack 這個按鈕,麻煩你換一個 Response 給我。」

Server 看了一下,就換了一個頁面給小菜鳥。

小菜鳥:「咦咦咦咦咦?!」

05_EventError

 

小菜鳥:「Server,這跟說好的不一樣啊!」

Server:「你給我的頁面看起來就跟我上次給出去的東西不一樣,一看就覺得不是正式文件,我為什麼要給你過!」

 

在 EventValidation(上)時有提到 EventValidation 的錯誤:「無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/> 或在網頁中使用 <%@ Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必須的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。」

在非駭客攻擊的情況下,會發生這種錯誤的,通常都是 Ajax 或 Javascript 動了一些東西、讓頁面狀態跟 Server 認可的不一樣,小菜鳥這次被 Server 不給過的原因就是這樣。

 

小菜鳥第一次請 Ajax 幫忙的時候,Ajax 可是很乖的照著事件順序做事,先完成 Page_Load、再去執行 BtnAjaxPostBack_Click;這兩個事件內容總共讓 Ajax 做了這些事情:Page_Load 的 BindData(即 GridView 的重新整理資料)、BtnAjaxPostBack_Click 則是讓 Label 的數字加一。

在這時候,Page_Load 裡的 BindData 可是要小心的!因為 TextBox 的值變化了、導致 GirdView 的資料數有所變化,不過因為 UpdatePanel 並沒有包到 GirdView、所以 GirdView 的狀態就還是舊的樣子。因此,即使頁面上看起來資料數還是 10 筆,但對 Server 來說,GridView 的資料數只有 1 筆。

接著小菜鳥第二次去找 Server 要執行 PostBack 按鈕事件時,Server 看到小菜鳥的網頁還是 10 筆資料、但 Server 只認可了1筆資料,所以小菜鳥就被拒絕了。

※ 另外值得一說的是:Server 檢查條件基本上是看控制項元件的,如果 GridView 裡面並沒有包含控制項,就不太會引發這種錯誤。

 

作者悠哉喝了口茶:「話說~你當初拿我泡的茶問來問去的時候,不是說大多數人的都是建議『在 PageLoad 裡的 DataBind 前面加上if(!IsPostback) 』嗎?」

小菜鳥:「那感覺怪怪的呀……而且萬一今天是在 UserControl 裡面不就死定了?」

作者:「我可以幫你買地獄入場卷!」

小菜鳥:「不要!」

就在小菜鳥嘟著嘴悶著氣的時候,HiddenField 剛好在一旁晃過去……

小菜鳥:「HiddenField!就是你了!快過來幫忙~~」

作者:「為什麼我突然有一種怪怪的感覺……HiddenField 不是神奇寶貝啊喂……」

 

於是小菜鳥的程式碼就變這個樣子:

06_aspxCodeWithHiddenField

07_csCodeWithHiddenField

利用一個 HiddenField 改兩個地方就可以避免掉 EventValidation 的錯誤囉!

 

小菜鳥:「嗯……看來應該 OK 了!話說這份作業是要交給誰啊?」

作者:「嗯?應該不用吧!那只是我送你上次沒洗茶壺的回禮,就不用跟我說謝謝了!」

小菜鳥:「……作者你這小氣鬼!」

 

主要相關參考:

http://mgracy.blog.163.com/blog/static/5764989820140157359281/

http://blog.darkthread.net/post-2008-05-13-kb-about-event-validation-of-asp-net-2-0.aspx

One Response to EventValidation (下)

  1. 引用通告: 小菜鳥蹦達日記目錄 | Eli

發表留言