1. 程式人生 > >回發或回撥引數無效 的解決辦法

回發或回撥引數無效 的解決辦法

回發或回撥引數無效

回發或回撥引數無效。在配置中使用 <pages enableEventValidation="true"/> 或在頁面中使用 <%@ Page EnableEventValidation="true" %> 啟用了事件驗證。出於安全目的,此功能驗證回發或回撥事件的引數是否來源於最初呈現這些事件的伺服器控制元件。如果資料有效並且是預期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來註冊回發或回撥資料以進行驗證。

相信這個錯誤許多人都遇到過,那這個錯誤是什麼意思? 它是怎麼來的? 又該如何解決呢?

我們先看提示在配置中使用 <pages enableEventValidation="true"/> 或在頁面中使用 <%@ Page EnableEventValidation="true" %> 啟用了事件驗證 這句話說我們設定了 enableEventValidation 屬性,設定的值為 true ,也就是啟用了事件驗證,那是不是也可以禁用該事件呢?將enableEventValidation 屬性設定為 false 後再執行程式,會發現錯誤沒有了,那是不是問題就解決了呢? 可能有的人設定false後問題解決了,可能有的人設定false之後,該問題解決了卻引發了連帶問題。事件驗證

又是怎麼一回事呢?

以下是MSDN的說明:

此事件驗證機制可降低未經授權的回發請求和回撥帶來的風險。當EnableEventValidation 屬性設定為 true 時,ASP.NET 僅允許在回發請求或回撥期間可由控制元件引發的事件。

通過此模型,控制元件可在呈現期間註冊其事件,然後在回發或回撥期間驗證這些事件。預設情況下,ASP.NET 中的所有事件驅動控制元件均使用此功能。

強烈建議不要禁用事件驗證。如果確實需要禁用事件驗證,請確保不會構造出對應用程式產生意料之外影響的回發。


在大多數情況下,請通過在 Web.config 檔案中設定 @ Page 指令的 enabledEventValidation 屬性 (Attribute) 或頁元素的 enableEventValidation 屬性 (Attribute) 來設定 EnableEventValidation 屬性 (Property)。如果在程式碼中設定 EnableEventValidation 屬性,則在頁處理的 Page_Init 階段進行設定。

原來事件驗證機制是在ASP.NET 2.0裡新增的,這個設計的目的是為了防止惡意使用者利用post 方法傳送一些惡意資料。這就是事件驗證機制的由來。

同時我們也看到了強烈建議不要禁用事件驗證,也就是剛才的做法是不正確的。那該如何解決呢?繼續看錯誤提示

如果資料有效並且是預期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來註冊回發或回撥資料以進行驗證。

那怎麼算資料是有效並且是預期的呢? ClientScriptManager.RegisterForEventValidation 這個方法又是怎麼回事呢?

說到這裡,我們要先斷一下,先看一下會在什麼情形下引發 回發或回撥引數無效 (Invalid postback or callback argument.) 這個錯誤。

網上許多文章將這個錯誤歸結為以下幾種情況:

一 是 Form巢狀,一個頁面只能有一個Form,仔細檢查程式碼就可以解決。
二 是 在下拉選單中使用ajax,常見於省市聯動選單,可能是由於在aspx頁面賦給了下拉選單初始Item值,在事件回發時提示該錯誤,將下拉選單初始Item值刪除,在繫結事件中新增Item項。
三 是 if (!Page.IsPostBack)
四 是 DropDownList 控制元件的ListItem 的Value 屬性 包含漢字.只要將Value 改為英文或數字的就行了。

那實際情況是否是這樣的呢?我們來分別看一下每種情況

第一種Form巢狀,首先一個頁面是可以有多個Form的,但是隻能有一個Form 被標記為 runat="server"
並且多個Form不可以巢狀。 那Form 巢狀會不會引起本文這個錯誤呢?我試了幾次都沒有出現本文的錯誤。
但如果Form 沒載入完畢的時候提交Form則會出現本文的錯誤,不過這與Form 巢狀無關。

第二種下拉選單,ajax應用中包含下拉列表框(DropDownList)是出現這個錯誤頻率最高的Case了,那為什麼會這樣呢?是否像網上所說的那樣呢?實則不然,先讓我們看下ajax應用中的下拉列表框做了那些事,常見的是省市聯動的ajax應用,市的下拉列表框在頁面載入後是沒有內容的,是根據使用者選擇的省 異步向伺服器請求然後將響應解析之後載入到市的下拉列表框中,然後提交。當提交的時候本文的錯誤就出現了,那提交的時候做了什麼事出現了這個錯誤呢?原來在頁面呈現的時候,DropDownList 的 render 事件,會遍歷 DropDownList 每一項的Value 屬性,與 DropDownList 的UniqueID 屬性 hash 之後做 XOR 並將結果儲存到頁面中。儲存在 id 為 __EVENTVALIDATION 的 hidden中,它看起來可能是這樣的 <input type="hidden" id="__EVENTVALIDATION" name= "__EVENTVALIDATION" value="/wEWBQKGg9abDQKd9sHMBgKc9s........" /> 當我們選擇省市的DropDownList 並提交時,在 DropDownList 的 LoadPostData 事件中會驗證提交的內容與 id 為 __EVENTVALIDATION 的 hidden 的Value ,因為之前市的DropDownList 並沒有項,可是提交的時候 我們給它加了若干項而事件驗證機制不知道,它會判斷出提交的資料不是預期的是未經授權的、是無效的,也就會報出本文的錯誤了。那如何解決也就明確了,只要我們告訴事件驗證機制那些資料是有效的問題也就迎刃而解了。