問題描述: 這是很多ASP.NET初學者面對,發佈和詢問的常見問題。通常情況下,他們將錯誤消息發佈如下,並尋求解決方案,而不共享他們正在嘗試做的事情。
[ArgumentException:回發或回調參數無效。事件驗證在配置中啓用,或在頁面中啓用<%@ Page EnableEventValidation =「true」%>。爲了安全起見,此功能驗證回發或回調事件的參數來自最初呈現它們的服務器控件。如果數據有效且預期,請使用ClientScriptManager.RegisterForEventValidation方法爲註冊回發或回調數據進行驗證。]
雖然錯誤堆棧跟蹤本身通過設置eventvalidation來提示快速解決方案,但它不是推薦的解決方案,因爲它會打開一個安全漏洞。知道爲什麼會發生以及如何解決/處理根本問題總是很好的。
評估: 事件驗證是爲了驗證事件的來源是否是相關的呈現控件(而不是某些跨站點腳本等)。由於控件在渲染過程中註冊了它的事件,因此可以在回發或回調期間(通過__doPostBack參數)驗證事件。這可以降低未經授權或惡意回發請求和回調的風險。
參考:MSDN:Page.EnableEventValidation物業
此基礎上,我已經遇到或聽說引發討論問題的可能方案是: 案例#1:如果我們在請求數據尖括號,它看起來像一些腳本標記正在傳遞給服務器。
可能的解決方案: HTML編碼的JavaScript的幫助下角括號提交表單之前,即以「>」
function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","<");
modifiedString = modifiedString.replace(">",">");
return modifiedString;
}
案例#2替換「<」與「<」和「>」 :如果我們編寫用於在運行時更改客戶端控件的客戶端腳本,則可能會出現懸掛事件。一個示例可能是嵌入控件,其中內部控件註冊回發,但由於在外部控件上完成的操作而在運行時隱藏。當我在由多個表單標籤查找相同問題時,我在Carlo寫的MSDN博客上閱讀了這篇文章。
可能的解決方案: 在頁面的Render方法內爲事件驗證手動註冊控件。
protected override void Render(HtmlTextWriter writer)
{
ClientScript.RegisterForEventValidation(myButton.UniqueID.ToString());
base.Render(writer);
}
至於說,報告的其它常見的場景(它看起來像在這同一類別瀑布)的一個正在建設,其中一個表單標籤嵌入在服務器上運行的另一種形式的標籤頁。刪除其中一個可以糾正流程並解決問題。案例#3:如果我們在每次回傳時在運行時重新定義/實例化控件或命令,那麼相應的/相關的事件可能會發生折騰。一個簡單的例子可能是重新綁定每個頁面加載的數據網格(包括回發)。因爲在重新綁定時,網格中的所有控件都會有一個新的ID,在由datagrid控件觸發的事件期間,在回發時,控件ID會更改,因此事件可能無法連接到正確的控件引發問題。
可能的解決方案: 這可以通過確保在每次回發(此處重新綁定)時不重新創建控件來簡單解決。使用Page屬性IsPostback可以輕鬆處理它。如果你想在每個回發中創建一個控件,那麼有必要確保這個ID不會被改變。
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostback)
{
// Create controls
// Bind Grid
}
}
結論: 如所述,一個簡單的/直接溶液可以添加enableEventValidation =在Page指令或Web.config文件」假」,但不推薦。根據實施情況和原因,找出根本原因並相應地應用分辨率。
你在頁面上使用ASP.Net AJAX嗎? – JasonS 2008-09-19 16:47:04
是的我正在使用ASP.NET AJAX – jwarzech 2008-09-22 14:04:22