programing

잘못된 포스트백 또는 콜백 인수입니다.이벤트 유효성 검사는 "를 사용하여 활성화됩니다.

kakaobank 2023. 5. 7. 11:45
반응형

잘못된 포스트백 또는 콜백 인수입니다.이벤트 유효성 검사는 "를 사용하여 활성화됩니다.

클라이언트 측에서 페이지를 다시 게시할 때 다음과 같은 오류가 발생합니다.ASP를 수정하는 JavaScript 코드가 있습니다.클라이언트 측의 ListBox입니다.

이걸 어떻게 고칠까요?

아래 오류 세부 정보:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

Page_Load 이벤트에 코드가 있습니까?만약 그렇다면, 아마도 다음을 추가하는 것이 도움이 될 것입니다.

if (!Page.IsPostBack)
{ //do something }

이 오류는 명령을 클릭하고 Page_Load를 다시 실행할 때 발생합니다. 일반 수명 주기에서는 Page_Load -> Command -> Page_Load (다시) -> Process Item Command Event를 클릭합니다.

문제는 ASP입니다.NET은 이 추가 또는 제거된 목록 항목에 대해 알지 못합니다.아래에 나열된 여러 가지 옵션이 있습니다.

  • 이벤트 유효성 검사를 사용하지 않도록 설정합니다(매우 적은 비용으로 제공되는 보안을 약간 잃기 때문에 좋지 않은 생각).
  • ASP를 사용합니다.NET Ajax UpdatePanel(목록 상자를 업데이트 패널에 놓고 목록 상자를 추가하거나 제거하는 경우 업데이트를 트리거합니다.이렇게 하면 보기 상태 및 관련 필드가 업데이트되고 이벤트 유효성 검사가 통과됩니다.)
  • 클라이언트 측은 잊어버리고 기존 포스트백을 사용하고 서버 측 목록 항목을 추가하거나 제거합니다.

저는 DataGrid에 대한 경험이 있습니다.그 중 하나는 "선택" 버튼이었습니다.행의 "선택" 버튼을 클릭하면 다음 오류 메시지가 표시됩니다.

"잘못된 포스트백 또는 콜백 인수입니다.구성에서 또는 페이지에서 <%@PageEventValidation="true" %>를 사용하여 이벤트 유효성 검사를 활성화합니다.이 기능은 보안을 위해 포스트백 또는 콜백 이벤트에 대한 인수가 원래 이벤트를 렌더링한 서버 제어에서 발생하는지 확인합니다.데이터가 유효하고 예상되는 경우 클라이언트 스크립트 관리자를 사용합니다.RegisterForEventValidation 메서드를 사용하여 검증을 위해 포스트백 또는 콜백 데이터를 등록합니다."

저는 코드를 몇 개 바꿨고, 마침내 성공했습니다.나의 경험 경로:

페이지 속성을 다음으로 변경했습니다.EnableEventValidation="false"하지만 효과가 없었습니다.(보안상의 이유로 위험할 뿐만 아니라 이벤트 핸들러가 호출되지 않았습니다.void Grid_SelectedIndexChanged(object sender, EventArgs e)

는 구습니다를 했습니다.ClientScript.RegisterForEventValidation렌더 방식으로.하지만 효과가 없었습니다.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

컬럼의 을 그드열 의단유다변음경서다니에서 했습니다.PushButtonLinkButton작동했습니다! ("ButtonType="LinkButton").다른 경우에는 "LinkButton"과 같은 다른 컨트롤로 버튼을 변경할 수 있다면 제대로 작동할 것이라고 생각합니다.

이벤트 유효성 검사를 사용하지 않도록 설정하지 말고 2개 또는 3개를 수행해야 합니다.

asp:listbox 클라이언트 측에 항목을 추가할 때 두 가지 주요 문제가 발생합니다.

  • 첫 번째는 이벤트 유효성 검사를 방해한다는 것입니다.서버로 돌아온 것은 서버가 보낸 것이 아닙니다.

  • 두 번째는 이벤트 유효성 검사를 비활성화하더라도 페이지가 다시 게시될 때 목록 상자의 항목이 보기 상태에서 다시 작성되므로 클라이언트에서 변경한 내용이 손실된다는 것입니다.그 이유는 asp.net 이 목록 상자의 내용이 클라이언트에서 수정되기를 기대하지 않고 선택만 하기 때문에 사용자가 변경한 내용을 무시하기 때문입니다.

권장되는 대로 업데이트 패널을 사용하는 것이 가장 좋습니다.이 클라이언트 측면을 정말로 수행해야 하는 경우 다른 옵션은 일반 오래된 것을 사용하는 것입니다.<select>신에대 <asp:ListBox>항목 목록을 숨겨진 필드에 보관합니다.페이지가 클라이언트에서 렌더링되면 텍스트 필드 내용의 분할에서 페이지를 채울 수 있습니다.

그런 다음 게시할 준비가 되면 수정된 필드의 내용을 다시 채웁니다.<select>그러면 서버에서 다시 분할하고 항목을 처리해야 합니다. 선택한 항목이 서버로 되돌아갔기 때문입니다.

전반적으로 이 솔루션은 제가 별로 추천하지 않을 정도로 번거로운 솔루션이지만, 만약 당신이 정말로 listBox의 클라이언트 측 수정을 해야 한다면, 효과가 있습니다.하지만 이 경로로 이동하기 전에 업데이트 패널을 검토하는 것이 좋습니다.

위의 어떤 것도 저에게 효과가 없었습니다.더 파고든 후에 저는 문제의 원인이 되는 페이지에 적용된 2개의 양식을 간과했다는 것을 깨달았습니다.

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

최근 ASP에 유의하시기 바랍니다.NET은 iframe 문서 자체에 폼 태그가 포함된 폼 태그 내의 프레임이 중첩된 프레임인지 여부를 고려하기 시작했습니다.이 오류를 방지하기 위해 폼 태그에서 iframe을 제거해야 했습니다.

EnableEventValidation이 켜져 있는 웹 사이트에서 Repeater 컨트롤이 있는 웹 페이지가 있었기 때문에 Repeater에도 동일한 문제가 있었습니다.별로였어요.잘못된 포스트백 관련 예외가 발생했습니다.

저는 리피터에 EnableViewState="false"를 설정했습니다.장점은 웹 사이트나 웹 페이지에 대해 이벤트 유효성 검사를 끄는 것처럼 사용하기 쉽다는 것입니다. 그러나 범위는 이벤트 유효성 검사를 끄는 것보다 훨씬 작습니다.

클라이언트에서 JavaScript를 사용하여 ListBox를 수정할 때도 같은 문제가 있었습니다.페이지가 렌더링될 때 없었던 클라이언트에서 ListBox에 새 항목을 추가할 때 발생합니다.

제가 찾은 해결책은 클라이언트에서 추가할 수 있는 모든 유효한 항목을 이벤트 유효성 확인 시스템에 알리는 것입니다.페이지를 재정의하여 이 작업을 수행합니다.렌더하고 페이지를 호출합니다.클라이언트 스크립트.목록 상자에 JavaScript가 추가할 수 있는 각 값에 대한 RegisterForEventValidation:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

목록 상자에 유효할 가능성이 있는 값이 많은 경우 이 문제가 발생할 수 있습니다.제 경우에는 두 개의 ListBox 간에 항목을 이동하고 있었습니다. 하나는 가능한 모든 값을 포함하고 다른 하나는 처음에는 비어 있지만 사용자가 단추를 클릭할 때 JavaScript의 첫 번째 값의 하위 집합으로 채워집니다.이 경우 첫 번째 목록 상자의 항목을 반복하고 두 번째 목록 상자에 각각 등록하면 됩니다.

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}

당신은 당신의 .aspx 페이지에서 그런 것을 시도합니다.

더하다

EnableEventValidation="false"

어떤 질문이든 자유롭게 하세요!

여기서 언급되지 않은 다른 방법은 ListBox를 하위 클래스로 분류하는 것입니다.

예.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation은 System 특성을 해제합니다.Web.UI.SupportsEventValidation(이벤트 유효성 검사)을 하위 분류할 경우 명시적으로 다시 추가하지 않는 한 유효성 검사 루틴을 호출하지 않습니다.이것은 모든 컨트롤에서 작동하며, 컨트롤 기준으로 컨트롤을 "비활성화"할 수 있는 유일한 방법입니다(즉, 페이지 레벨이 아님).

클라이언트 사이드 스크립트를 통해 드롭다운 목록을 작성한 경우 양식을 서버에 다시 제출하기 전에 목록을 지우고 ASP를 선택합니다.NET은 불평하지 않을 것이고 보안은 여전히 켜져 있을 것입니다.

또한 DDL에서 선택한 데이터를 가져오려면 DDL에 "OnChange" 이벤트를 첨부하여 숨겨진 입력 또는 Style="display: none;" 텍스트 상자에 값을 수집할 수 있습니다.

3: 그리드 열의 버튼 유형을 "PushButton"에서 "LinkButton"으로 변경했습니다.작동했습니다! ("ButtonType="LinkButton") 다른 경우에는 "LinkButton"과 같은 다른 컨트롤로 버튼을 변경할 수 있다면 제대로 작동할 것이라고 생각합니다.

아미르, 나는 내가 당신을 투표로 선출할 수 있기를 바랍니다. (비록 내 대표는 너무 낮지만)저는 단지 이 문제를 겪고 있었고 이것을 바꾸는 것이 제 그리드 뷰에서 챔피언처럼 작동했습니다.조금만 제쳐두고, 제 생각에 유효한 코드는 ButtonType="Link"입니다.

이는 '편집'을 클릭하면 '업데이트'와 '취소'로 편집이 변경되고 제출 시 다시 '편집'으로 변경되기 때문인 것으로 생각됩니다.그리고 이러한 전환 제어는 .net을 불안하게 만듭니다.

EnableEventValidation="false"...............그것은 나에게 효과가 없습니다.

클라이언트 스크립트.이벤트 유효성 검사 등록...그것은 나에게 효과가 없습니다.

솔루션 1:

그리드 보기에서 버튼/이미지 버튼을 링크 버튼으로 변경합니다.작동합니다. (하지만 저는 ImageButton을 좋아합니다.)

연구: Button/ImageButton과 LinkButton은 서로 다른 방법을 사용하여 포스트백합니다.

원본 기사:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

솔루션 2:

OnInit()에 다음과 같은 코드를 입력하여 Button/ImageButton의 고유 ID를 설정합니다.

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

원본 기사:

http://www.c-sharpcorner.com/Forums/Thread/35301/

중첩 그리드 보기를 구현했지만 동일한 문제에 직면했습니다.나는 다음과 같은 이미지 버튼 대신 링크 버튼을 사용했습니다.

내가 이런 칼럼을 쓰기 전에:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

저는 이렇게 교체했습니다.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 

저도 비슷한 문제가 있었지만 ASP를 사용하지 않았습니다.넷 1.1 또는 자바스크립트를 통한 컨트롤 업데이트.제 문제는 파이어폭스에서만 발생했고 IE(!)에서는 발생하지 않았습니다.

PreRender 이벤트의 DropDownList에 다음과 같은 옵션을 추가했습니다.

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

내 "HF"(숨겨진 필드)에는 다음과 같이 새 줄로 구분된 옵션이 있습니다.

HF.value = "option 1\n\roption 2\n\roption 3";

문제는 드롭다운을 나타내는 "선택" 옵션에서 HTML 페이지가 깨졌다는 것입니다(즉, 줄이 새로 생겼다는 것입니다).

그래서 저는 한 줄을 추가하는 문제를 해결했습니다.

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

이것이 누군가에게 도움이 되기를 바랍니다.

변하면UseSubmitBehavior="True"UseSubmitBehavior="False"입니다.

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

이 문제에 대한 간단한 해결책은 페이지 로드에서 IsPostBack 검사를 사용하는 것입니다.그것으로 이 문제가 해결될 것입니다.

저도 같은 문제를 겪었습니다. 제가 한 일은:

조건을 했습니다.if(!IsPostBack)그리고 그것은 잘 작동합니다 :)

이 오류는 포스트백 없이 표시됩니다.

코드 추가:

If(!IsPostBack){

 //do something

}

이 경우 그리드의 RowDataBound에 있는 버튼에 id를 추가합니다.그것은 당신의 문제를 해결할 것입니다.

Ajax UpdatePanel이 제작하는데, Ajax 포스트백 오버헤드를 무시하고 가장 쉬운 방법이라고 생각합니다.

저는 이것이 아주 오래된 게시물이라는 것을 알고 있습니다.애플리케이션을 호출한다고 가정하면 다음과 같은 아이디어가 도움이 됩니다.

  1. 페이지에서 IC 콜백 이벤트 처리기 구현
  2. ClientScriptManager를 호출합니다.서버 측 코드를 호출할 CallbackEventReference 가져오기
  3. 오류 메시지에 표시된 대로 클라이언트 스크립트 관리자를 호출할 수 있습니다.이벤트 유효성 확인을 위한 등록

전체 제어가 필요하지 않은 경우 업데이트 패널을 사용할 수 있습니다.

일반 ASPX 페이지를 콘텐츠 페이지로 변환할 때도 같은 문제가 발생했습니다.

에는 이문가페는지가 .</form>두 개의 양식 끝 태그가 런타임에 렌더링되어 이 문제가 발생했습니다.페이지에서 추가 양식 끝 태그를 제거하면 이 문제가 해결됩니다.

그리드 보기를 사용하고 페이지 로드 시 그리드 보기를 바인딩하지 않는 경우 !ispostback에서 그리드 보기의 편집 및 삭제 행을 클릭하면 이 오류가 발생합니다.

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        bindGridview();
        }

4분 전에 저는 같은 오류를 받았습니다.그럼 저도 당신처럼 30분 동안 조사했습니다.모든 포럼에서 일반적으로 "add page enableEvent..= false 또는 true".제안된 어떤 해결책도 제가 그것을 찾을 때까지 제 문제를 해결하지 못했습니다.안타깝게도 문제는 ASP입니다.NET 버튼.2초 전에 제거했습니다.저는 "이미지 버튼"으로 대체하려고 했지만, 역시 받아들일 수 없었습니다(같은 오류가 발생했기 때문에).

마침내 나는 로 대체되었습니다.LinkButton효과가 있는 것 같습니다!

데이터 목록을 사용하던 중 푸시 버튼에 동일한 오류가 발생했습니다.IsPostBack을 사용하여 컨트롤을 확인하고 채우는 것만으로 문제가 해결됩니다!좋아요!!!

제게 도움이 된 것은 다음 코드를 page_load에서 page_preender로 옮기는 것입니다.

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

가장 좋은 방법은 숨겨진 필드를 사용하고 이벤트 유효성 검사를 사용하지 않도록 설정하지 않는 것입니다. 또한 모든 목록 상자, 드롭다운 목록을 서버 속성과 함께 선택하도록 변경합니다.

Ajax 업데이트 패널을 사용하는 경우.더하다<Triggers>태그와 내부는 버튼 또는 컨트롤을 트리거하여 포스트백을 발생시킵니다.<asp:PostBackTrigger .../>

채워질 수 있는 데이터를 미리 알고 있는 경우 클라이언트 스크립트 관리자를 사용하여 이 문제를 해결할 수 있습니다.이전 사용자 선택에서 Javascript를 사용하여 드롭다운 상자를 동적으로 채울 때 이 문제가 발생했습니다.

다음은 렌더 메서드(VB 및 C#)를 재정의하고 드롭다운 목록 ddCar의 잠재적 값을 선언하는 몇 가지 예제 코드입니다.

VB에서:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

또는 C#의 약간의 변동은 다음과 같습니다.

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

신입생의 경우:이것은 파일 뒤에 있는 코드(.vb 또는 .cs)로 들어가거나 ASPX 파일에서 사용될 경우 랩으로 넣을 수 있습니다.<script>꼬리표

이것이 제가 그것을 갖게 된 이유였습니다.

ASP:ListBox를 가지고 있었습니다.처음에는 숨겨졌습니다.클라이언트 측에서는 AJAX를 통해 옵션을 입력합니다.사용자가 하나의 옵션을 선택했습니다.그런 다음 [제출] 단추를 누르면 서버는 ListBox에 대한 모든 재미를 느낄 수 있습니다. ListBox에는 옵션이 없습니다.

그래서 제가 한 일은 양식을 서버에 다시 제출하기 전에 모든 목록 선택사항을 지웠는지 확인하는 것입니다.이렇게 하면 목록이 클라이언트에게 비어 있고 다시 비어 있기 때문에 서버가 불만을 제기하지 않습니다.

정렬됨!!!

언급URL : https://stackoverflow.com/questions/228969/invalid-postback-or-callback-argument-event-validation-is-enabled-using-page

반응형