1. 程式人生 > >弗尤部落格(七)

弗尤部落格(七)

System.ArgumentException: 回發或回撥引數無效。在配置中使用 < pages enableEventValidation="true"/>

關於在同一個頁面中使用Gridview控制元件的時候發現氣updaeting事件無法被伺服器所響應,看來它的錯誤報警然後查詢了部分資料現在將整理的解決方法總結如下:點選update 事件無法響應原因出在回發或回撥引數無效。在配置中使用 <pages enableEventValidation="true"/> 或在頁面中使用 <%@ Page EnableEventValidation="true" %> 啟用了事件驗證。出於安全目的,此功能驗證回發或回 調事件的引數是否來源於最初呈現這些事件的伺服器控制元件。如果資料有效並且是預期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來註冊回發或回撥資料以進行驗證。


說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆疊跟蹤資訊,以瞭解有關該錯誤以及程式碼中導致錯誤的出處的詳細資訊。
         異常詳細資訊: System.ArgumentException: 回發或回撥引數無效。在配置中使用 < pages enableEventValidation="true"/> 或在頁面中使用 <% @ Page EnableEventValidation="true" %> 啟用了事件驗證。出於安全目的,此功能驗證回發或回撥事件的引數 是否來源於最初呈現這些事件的伺服器控制元件。如果資料有效並且是預期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來註冊回發或回撥資料以進行驗證。

 看了半天也沒發現是什麼問題,檢查了一遍程式碼也是對的,頁面所有控制元件的ID,屬性都檢查了還是沒找到問題。後來才發現是這麼回事:

發生條件:

1.畫面有隱藏控制元件。

2.多次的Gridview繫結。

3.多個Form中巢狀使用。

發生原因:

.NET基於頁面中的輸出元素會在最終頁面中生成一個__EVENTVALIDATION隱藏欄位。做了一個簡單的測試。頁面中建立一個<asp: button id="btnSubmit" runat="server" text="Submit" tooltip="Submit" />,同時建立對應的Click事件處理程式。執行程式,可以正確響應事件。然後設定btnSubmit.Visable=false,手動在頁面 上面新增<input type="submit" name="btnSubmit" value="Submit" />。執行程式,會出現一個包含EnableEventValidation內容的異常。設定<@Page EnableEventValidation="false">再執行程式,又可以正確響應事件。觀察前後兩次__EVENTVALIDATION 的內容,可以發現是不同的。關於出現的異常,可以認為在輸出的時候沒有包含btnSubmit,可是再提交到後臺的時候卻有相應的內容,前後不一致,所以 在開啟事件校驗的情況下.NET丟擲了異常。

 解決辦法1:
Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //繫結資料;
    }
}
解決辦法2:
<pages enableEventValidation="false"/>

1、在頁面的<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 中新增 EnableEventValidation="false" 就可以了。(首先考慮的)

2、通過web.config 
<system.web> 
<pages enableEventValidation="false"/> 

3、是Form巢狀,一個頁面只能有一個Form,仔細檢查程式碼就可以解決。 

4、如果頁面含有 DropDownList 或 ListBox這樣的控制元件,可能以下原因造成: 

4.1 在下拉選單中使用ajax,常見於省市聯動選單,可能是由於在aspx頁面賦給了下拉選單初始Item值,在事件回發時提示該錯誤,將下拉選單初始Item值刪除,在繫結事件中新增Item項。
4.2 原因是 DropDownList 控制元件的ListItem 的Value 屬性 包含漢字.只要將Value 改為英文或數字的就行了.最好在web.config中新增如下語句:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>因為 POSTBACK 如果不採用 UTF-8 編碼, JAVASCRIPT 會認為有問題。
只改 requestEncoding="utf-8" 就可以了,responseEncoding="utf-8" 不用 

5.Register For Event Validation 
其原理就是讓asp.net記錄這個postback value. 

RegisterForEventValidation必須在render時呼叫.

獲取datalist中控制元件兩種情況

如果在當前行點選按鈕時候,獲取當前行的textbox內容,如下:
button1——Click中
DataListItem item=(DataListItem)((Button)sender).NamingContainer;
TextBox txt= item.FindControl("TextBox1") as TextBox
//在page_load中:
if(!IsPostBack)
{
  //繫結datalist
}
//在獲取textbox值時候,如果要獲取所有textbox值,遍歷
public partial class _Default : System.Web.UI.Page
{
  //後臺程式碼取值事件
  protected void ........(....)
  {
  foreach(DataListItem item in DataList1.Items)
  {
  TextBox txt= item.FindControl("TextBox1") as TextBox
  this.product = txt.Text;
  }
  }
}

 參考連結:

https://blog.csdn.net/dongge825/article/details/7868151

https://blog.csdn.net/dickens88/article/details/6663230