2013-05-10 67 views
1

我還沒有找到符合我的情況的答案,所以我發佈了一個回答問題,希望它能幫助其他人。無效的回發或回調參數(HiddenField和容器可見= false)

我得到的錯誤

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

at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) 
    at System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) 
    at System.Web.UI.WebControls.HiddenField.LoadPostData(String postDataKey, NameValueCollection postCollection) 
    at System.Web.UI.WebControls.HiddenField.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) 
    at System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

我有一個數據綁定的ListView(少數數百行),對每一行按鍵。按鈕帶來一個彈出。彈出窗口包含下拉列表和其他控件,用於執行異步回發。我需要確保我做異步回發,以避免刷新我的大表。

當我單擊一行上的按鈕時,出現錯誤,然後更改彈出窗口內的下拉列表,觸發回發(所選項目已更改)。繁榮。

下面是減少樣本的標記,沒有彈出窗口和JavaScript!它仍然存在這個問題。在連續的按鈕上單擊兩次以獲取錯誤。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestPopupAsynchPostback.Default" %> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="scriptMgr" runat="server" ScriptMode="Debug" EnablePartialRendering="true" 
      EnableScriptGlobalization="true" EnableScriptLocalization="true" EnablePageMethods="true"/> 
     <asp:ObjectDataSource ID="ListDataSource" runat="server" SelectMethod="List" TypeName="TestPopupAsynchPostback.Default" /> 
     <asp:Label runat="server" ID="PageLabel"></asp:Label> 
     <asp:ListView ID="EL" runat="server" DataSourceID="ListDataSource" OnItemDataBound="EntityList_OnItemDataBound"> 
      <LayoutTemplate> 
       <table border="1"> 
        <tr id="itemPlaceholder" runat="server" enableviewstate="false"> 
        </tr> 
       </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <tr runat="server" id="DefaultRow" enableviewstate="false"> 
        <td> 
         <asp:Label ID="Lbl" runat="server" EnableViewState="false" /> 
        </td> 
        <td> 
         <button runat="server" type="button" id="ReportingButton" enableviewstate="false" onserverclick="ReportingButton_OnClick" causesvalidation="false">click</button> 
        </td> 
       </tr> 
       <%-- Fix part 1: Change SpecialRow visible = true--%> 
       <tr runat="server" id="SpecialRow" visible="false" enableviewstate="false"> 
        <td> 
         <asp:Label ID="Lbl2" runat="server" EnableViewState="false" /> 
         <asp:HiddenField runat="server" ID="fn_hid" /> 
        </td> 
       </tr> 
      </ItemTemplate> 
     </asp:ListView> 
    </form> 
</body> 
</html> 

下面的代碼背後:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 

namespace TestPopupAsynchPostback 
{ 
    public partial class Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      ScriptManager sm = ScriptManager.GetCurrent(Page); 
      PageLabel.Text = DateTime.UtcNow.ToString() + " IsPostBack:" + IsPostBack + " IsInAsyncPostBack:" + (sm == null ? "" : sm.IsInAsyncPostBack.ToString()); 
     } 

     protected override void Render(HtmlTextWriter writer) 
     { 
      ScriptManager sm = ScriptManager.GetCurrent(this.Page); 
      if (sm != null) 
      { 
       foreach (ListViewDataItem row in EL.Items) 
       { 
        HtmlButton reportingButton = row.FindControl("ReportingButton") as HtmlButton; 
        if (reportingButton != null) 
         sm.RegisterAsyncPostBackControl(reportingButton); 
       } 
      } 
      base.Render(writer); 
     } 

     public IList<string> List() 
     { 
      return (new string[] { "ONE", "TWO"}).ToList(); 
     } 

     protected void ReportingButton_OnClick(object sender, EventArgs e) 
     { 
      //Do something useful here, for now, just a postback event 
     } 

     protected void EntityList_OnItemDataBound(object sender, ListViewItemEventArgs e) 
     { 
      Label lbl = e.Item.FindControl("Lbl") as Label; 
      Label lbl2 = e.Item.FindControl("Lbl2") as Label; 
      lbl.Text = lbl2.Text = e.Item.DataItem.ToString(); 

      HtmlTableRow specialRow = e.Item.FindControl("SpecialRow") as HtmlTableRow; 
      if (e.Item.DataItemIndex%2 == 0) 
      { 
       HiddenField fn_hid = e.Item.FindControl("fn_hid") as HiddenField; 
       fn_hid.Value = "test1"; 
       specialRow.Visible = true; 
      } 
      //Fix part 2: set SpecialRow Visible = false in code behind 
      //else 
      // specialRow.Visible = false; 
     } 
    } 
} 

回答

2

我最初以爲我的javascript有過錯,因爲我用它修改的事情。但是,創建示例頁面的過程幫助我發現問題。

事實證明,它與JavaScript或彈出窗口無關。這與HtmlControl(asp.net服務器端控件)中包含的HiddenField有關,其中Visible = false IN THE MARKUP。然後,我需要在OnItemDataBound事件中使用後面的代碼來設置Visible = true。

這是什麼原因導致我的錯誤:看來,因爲容器(TR SpecialRow)是可見的= false,我猜測一些東西沒有呈現。然後我進入OnItemDataBound,決定這行必須顯示,並設置Visible = true並設置我的HiddenField的值。繁榮。 如果我刪除隱藏字段的標記並且未設置其值,則不會崩潰。 所以它不僅僅是TR的可見性,它也是HiddenField。

我修復:沒有設置可見=假的標記,並改變OnItemDataBound需要時設置可見=假。

換句話說:我默認隱藏標記並使用代碼來顯示它們。我改變了這一點,默認情況下在標記中顯示,並使用後面的代碼隱藏它們。

我在上面的標記和代碼中添加了修復程序。

+0

感謝分享,但您爲什麼不把它標記爲已回答? – 2013-09-04 07:18:31

+0

對不起,現在標記爲已回答。 – 2013-09-05 07:47:39

相關問題