1. 程式人生 > >弗尤博客(七)

弗尤博客(七)

def 它的 nco lse 條件 鏈接 partial web 事件處理程序

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































弗尤博客(七)