2008-09-19 261 views
3

我有一個ASP.net應用程序在開發環境中正常工作,但在生產環境中單擊執行回發的鏈接時會引發以下異常。有任何想法嗎?回發或回調參數無效

回發或回調參數無效。 在配置中使用 或 頁面中的EnableEventValidation =「true」%>啓用了事件驗證。爲了安全起見,此 功能驗證參數 回發或回調事件從 最初呈現它們的服務器控件發起 。如果數據 有效並且是預期的,請使用 ClientScriptManager.RegisterForEventValidation 方法來註冊 回發或回調數據以驗證 。

編輯:這似乎與IE6查看時,但不與IE7,任何想法只能是這樣嗎?

+0

你在頁面上使用ASP.Net AJAX嗎? – JasonS 2008-09-19 16:47:04

+0

是的我正在使用ASP.NET AJAX – jwarzech 2008-09-22 14:04:22

回答

0

似乎當回發發生時,頁面上的數據/控件會改變。如果關閉頁面指令中的事件驗證會發生什麼情況。

<%@ Page ... EnableEventValidation = "false" /> 
1

這可以,如果你發佈這似乎是可能的惡意的事情發生;例如其中包含html的文本框,但在回發之前不進行編碼。如果您允許提交html或腳本,則需要對其進行編碼,以便將字符(如<)作爲& lt ;.

0

我只有在我的網頁中嵌套<form>標籤時纔得到這個。 IE6將查看嵌套的表單標記,並嘗試發佈那些表單以及ASP.NET主窗體中的值,從而導致錯誤。其他瀏覽器不會發布嵌套表單(因爲它是無效的HTML)並且不會收到錯誤。

您當然可以通過EnableEventValidation = "false"來解決這個問題,但這可能意味着您的發佈值和視圖狀態會出現問題。最好先剔除嵌套的<form>標籤。

還有其他一些地方可能會出現這種情況,例如表單字段中的HTML-esque值,但我認爲這些錯誤消息更具體。在引發這個問題的通用回傳中,我只需檢查呈現的頁面以獲取額外的<form>標籤。

1

問題描述: 這是很多ASP.NET初學者面對,發佈和詢問的常見問題。通常情況下,他們將錯誤消息發佈如下,並尋求解決方案,而不共享他們正在嘗試做的事情。

[ArgumentException:回發或回調參數無效。事件驗證在配置中啓用,或在頁面中啓用<%@ Page EnableEventValidation =「true」%>。爲了安全起見,此功能驗證回發或回調事件的參數來自最初呈現它們的服務器控件。如果數據有效且預期,請使用ClientScriptManager.RegisterForEventValidation方法爲註冊回發或回調數據進行驗證。]

雖然錯誤堆棧跟蹤本身通過設置eventvalidation來提示快速解決方案,但它不是推薦的解決方案,因爲它會打開一個安全漏洞。知道爲什麼會發生以及如何解決/處理根本問題總是很好的。

評估: 事件驗證是爲了驗證事件的來源是否是相關的呈現控件(而不是某些跨站點腳本等)。由於控件在渲染過程中註冊了它的事件,因此可以在回發或回調期間(通過__doPostBack參數)驗證事件。這可以降低未經授權或惡意回發請求和回調的風險。

參考:MSDN:Page.EnableEventValidation物業

此基礎上,我已經遇到或聽說引發討論問題的可能方案是: 案例#1:如果我們在請求數據尖括號,它看起來像一些腳本標記正在傳遞給服務器。

可能的解決方案: HTML編碼的JavaScript的幫助下角括號提交表單之前,即以「>」

function HTMLEncodeAngularBrackets(someString) 
{ 
var modifiedString = someString.replace("<","&lt;"); 
modifiedString = modifiedString.replace(">","&gt;"); 
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文件」假」,但不推薦。根據實施情況和原因,找出根本原因並相應地應用分辨率。

0

我有類似的事情發生,當我手動輸入文本時工作正常,但當我輸入基於SQL查詢的數據時,列表中的最後一項會拋出此異常。我搜查了所有Q & A,沒有與我的問題相符。

就我而言,問題是SQL數據中有一個不可打印的字符(\ r)。我猜測服務器根據不可打印字符的存在創建了一個哈希碼,但是它從實際顯示在ListBox中的字符串中刪除,因此第二個哈希值與第一個哈希值不匹配。清理字符串並刪除不可打印的字符,然後將其放入ListBox中解決了我的問題。

這可能是一個超級邊緣案例,但我想添加這只是爲了完成(並希望可以幫助別人不花2天瘋狂)。

相關問題