回發或回調參數無效的各類狀況分析及解決辦法 回發或回調參數無效的各類狀況分析及解決辦法

http://www.cnblogs.com/ajian/archive/2010/01/13/1646402.htmlhtml

 

回發或回調參數無效的各類狀況分析及解決辦法

 

今天,在實現級聯菜單的時候,忽然出現一下錯誤:ajax

回發或回調參數無效。在配置中使用 <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 僅容許在回發請求或回調期間可由控件引起的事件。post

經過此模型,控件可在呈現期間註冊其事件,而後在回發或回調期間驗證這些事件。默認狀況下,ASP.NET 中的全部事件驅動控件均使用此功能。this

強烈建議不要禁用事件驗證。若是確實須要禁用事件驗證,請確保不會構造出對應用程序產生意料以外影響的回發。url

在大多數狀況下,請經過在 Web.config 文件中設置 @ Page 指令的 enabledEventValidation 屬性 (Attribute) 或頁元素的 enableEventValidation 屬性 (Attribute) 來設置 EnableEventValidation 屬性 (Property)。若是在代碼中設置 EnableEventValidation 屬性,則在頁處理的 Page_Init 階段進行設置。spa

出現此類錯誤的Case有如下幾種:orm

1.From的嵌套集解決方法

首先一個頁面是能夠有多個Form的,可是隻能有一個Form 被標記爲 runat="server" 
而且多個Form不能夠嵌套。 那Form 嵌套會不會引發本文這個錯誤呢?我試了幾回都沒有出現本文的錯誤。 
但若是Form 沒加載完畢的時候提交Form則會出現本文的錯誤,不過這與Form 嵌套無關。

2.if(!this.Page.IsPostBack)

這個錯誤包括不少種狀況,須要視狀況而定。

3.級聯菜單

緣由分析:

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 並無項,但是提交的時候咱們給它加了若干項而事件驗證機制不知道,它會判斷出提交的數據不是預期的是未經受權的、是無效的,也就會報出本文的錯誤了。那如何解決也就明確了,只要 咱們告訴事件驗證機制那些數據是有效的問題也就迎刃而解了。

解決方法:

在作級聯菜單的時候能夠將DropDownList控件替換成select,如:

UI-->

<asp:DropDownList id=」ddlCity」 runat=」server」>

</asp:DropDownList>

C#-->

string cityName = this.ddCity.SelectedItemValue;

替換爲:

UI-->

<select id=」ddlCity」 runat=」server」>

</select>

C#—>

string cityName = Request[this.ddlCity.UniqueID]

4.是 DropDownList 控件的ListItem 的Value 屬性 包含漢字.只要將Value 改成英文或數字的就好了。

相關文章
相關標籤/搜索