2013-05-10 4 views
1

내 상황에 맞는 답변을 찾을 수 없어 다른 사용자에게 도움이되기를 희망하는 답변 된 질문을 게시하고 있습니다.유효하지 않은 포스트 백 또는 콜백 인수 (HiddenField 및 Container Visible = 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) 

은 내가 각 행에 버튼, (몇 100S 행 포함) 데이터 바인딩 ListView를 가지고있다. 단추가 팝업을 가져옵니다. 팝업에는 드롭 다운리스트와 비동기 포스트 백을 수행하는 다른 컨트롤이 있습니다. 내 큰 테이블을 새로 고치는 것을 피하기 위해 비동기 포스트 백을 수행해야합니다.

한 행의 버튼을 클릭하면 오류가 발생하고 포스트 백 (선택한 항목이 변경됨)을 발생시키는 팝업 내 드롭 다운 목록을 변경합니다. 팔.

다음은 팝업 및 자바 스크립트가 전혀없는 축소 된 샘플을위한 마크 업입니다. 그것은 여전히 ​​문제를 보여줍니다. 행에있는 버튼을 두 번 클릭하여 오류를 가져 오십시오.

<%@ 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

. 그러나 샘플 페이지를 만드는 과정에서 문제를 찾는데 도움이되었습니다.

자바 스크립트 나 팝업과는 아무런 관련이 없습니다. 그것은 HiddenField TR HtmlControl (asp.net 서버 쪽 컨트롤) Visible = false MARKUP있는 포함 된 함께 할 수 있습니다. 그런 다음 OnItemDataBound 이벤트에서 필요한 경우 Visible = true로 설정하는 코드를 사용합니다.

이것은 나를 위해 오류를 일으키는 것입니다. 컨테이너 (TR SpecialRow)가 Visible = false이기 때문에 뭔가 렌더링되지 않은 것으로 보입니다. 그런 다음 OnItemDataBound를 따라 가서이 행을 표시해야한다고 결정하고 Visible = true로 설정하고 내 HiddenField 값을 설정합니다. 팔. 숨김 필드에 대한 태그를 제거하고 값을 설정하지 않으면 충돌이 없습니다. 그래서 TR 자체의 가시성뿐 아니라 HiddenField도 있습니다.

수정 사항 : 마크 업에서 Visible = false를 설정하지 말고 필요한 경우 OnItemDataBound를 변경하여 Visible = false를 설정합니다.

다른 말로 : 마크 업에서 내용을 숨기고 기본값을 사용하여 코드를 표시하도록 기본값을 설정했습니다. 이 코드를 바꿔 마크 업에 기본적으로 표시하고 숨겨진 코드를 사용하여 숨 깁니다.

위의 마크 업과 코드에서 수정 사항을 추가했습니다.

+0

공유 주셔서 감사합니다.하지만 답변으로 표시하지 않은 이유는 무엇입니까? –

+0

죄송합니다. 지금 답변으로 표시되었습니다. –