[.net] 잘못된 포스트 백 또는 콜백 인수 ‘<pages enableEventValidation =“true”/>’를 사용하여 이벤트 유효성 검증이 사용 가능합니다.

클라이언트 쪽에서 페이지를 다시 게시하면 다음 오류가 발생합니다. 클라이언트 쪽에서 asp : ListBox를 수정하는 JavaScript 코드가 있습니다.

이 문제를 어떻게 해결합니까?

아래 오류 정보 :

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



답변

문제는 ASP.NET이이 추가 또는 제거 된 목록 항목에 대해 알 수 없다는 것입니다. 여러 가지 옵션이 있습니다 (아래에 나열 됨).

  • 이벤트 유효성 검사 비활성화
  • ASP.NET Ajax UpdatePanel을 사용하십시오. (목록 상자를 추가하거나 제거하면 업데이트 패널에 목록 상자를 넣고 업데이트를 트리거하십시오. 이런 방식으로 viewstate 및 관련 필드는 업데이트를 받고 이벤트 유효성 검증은 통과합니다.)
  • 클라이언트 측을 잊고 클래식 포스트 백을 사용하고 서버 측 목록 항목을 추가하거나 제거하십시오.

이게 도움이 되길 바란다.


답변

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

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

이 오류는 명령을 클릭하고 Page_load가 다시 실행될 때 발생합니다. 정상적인 수명주기는 Page_Load-> Command-> Page_Load (다시)-> ItemItem 이벤트 처리입니다.


답변

DataGrid에 경험이 있습니다. 열 중 하나는 “선택”버튼이었습니다. 행의 “선택”버튼을 클릭했을 때이 오류 메시지가 표시되었습니다.

“잘못된 포스트 백 또는 콜백 인수입니다. 페이지에서 구성 또는 <% @ Page EnableEventValidation =”true “%>에서 이벤트 유효성 검사를 사용하도록 설정했습니다. 보안을 위해이 기능은 포스트 백 또는 콜백 이벤트에 대한 인수가 서버 컨트롤에서 시작되었는지 확인합니다. 데이터가 유효하고 예상되는 경우 ClientScriptManager.RegisterForEventValidation 메소드를 사용하여 유효성 검증을 위해 포스트 백 또는 콜백 데이터를 등록하십시오. “

몇 가지 코드를 변경하고 마침내 성공했습니다. 내 경험 경로 :

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

2) 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);
            }
        }
    }
}

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


답변

이벤트 유효성 검사를 비활성화하지 말고 실제로 2 또는 3을 수행하려고합니다.

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

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

  • 두 번째는 이벤트 유효성 검사를 비활성화하더라도 페이지가 다시 게시되면 목록 상자의 항목이 viewstate에서 다시 작성되므로 클라이언트에서 변경 한 내용이 손실됩니다. 그 이유는 asp.net은 클라이언트에서 목록 상자의 내용이 수정 될 것으로 예상하지 않고 선택 만 할 것으로 예상하므로 변경 한 내용을 모두 버립니다.

가장 좋은 방법은 권장대로 업데이트 패널을 사용하는 것입니다. 이 클라이언트 쪽을 실제로 수행해야하는 또 다른 옵션은. <select>대신 일반을 사용하고 <asp:ListBox>항목 목록을 숨겨진 필드에 유지하는 것입니다. 페이지가 클라이언트에서 렌더링되면 텍스트 필드 내용의 분할에서 페이지를 채울 수 있습니다.

그런 다음 게시 할 준비가되면 수정 된에서 숨겨진 필드의 내용을 다시 채 웁니다 <select>. 물론 서버에서 다시 선택했기 때문에 선택 항목이 비어 있으므로 서버에서 다시 분할하고 항목으로 무언가를 수행해야합니다.

대체로 권장하지 않는 꽤 번거로운 솔루션이지만 listBox의 클라이언트 측 수정을 실제로 수행 해야하는 경우 작동합니다. 그러나이 경로로 가기 전에 updatePanel을 살펴 보는 것이 좋습니다.


답변

EnableEventValidation이 설정된 웹 사이트에 Repeater 컨트롤이있는 웹 페이지가 있기 때문에 Repeater와 동일한 문제가 발생했습니다. 좋지 않았다. 잘못된 포스트 백 관련 예외가 발생했습니다.

나를 위해 일한 것은 Repeater에 EnableViewState = “false”를 설정하는 것이 었습니다. 장점은 웹 사이트 나 웹 페이지에 대해 이벤트 유효성 검사를 해제하는 것만 큼 사용하기가 더 간단하지만 범위가 이벤트 유효성 검사를 해제하는 것보다 훨씬 적다는 것입니다.


답변

위의 어느 것도 나를 위해 일하지 않았습니다. 더 파고 난 후에 나는 페이지에 적용된 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을 고려하기 시작했습니다. 이 오류를 피하기 위해 iframe을 양식 태그 밖으로 이동해야했습니다.


답변

클라이언트에서 JavaScript를 사용하여 ListBox를 수정할 때도 동일한 문제가 발생했습니다. 페이지가 렌더링 될 때 존재하지 않은 클라이언트에서 ListBox에 새 항목을 추가 할 때 발생합니다.

내가 찾은 수정은 클라이언트에서 추가 할 수있는 모든 유효한 항목을 이벤트 유효성 검사 시스템에 알리는 것입니다. JavaScript가 목록 상자에 추가 할 수있는 각 값에 대해 Page.Render를 재정의하고 Page.ClientScript.RegisterForEventValidation을 호출하면됩니다.

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

목록 상자에 대해 잠재적으로 유효한 값이 많을 경우 다소 어려움이 될 수 있습니다. 필자의 경우 두 ListBox 사이에서 항목을 이동했습니다. 하나는 가능한 모든 값을 가지고 있고 다른 하나는 처음에는 비어 있지만 사용자가 버튼을 클릭하면 JavaScript의 첫 번째 값의 하위 집합으로 채워집니다. 이 경우 첫 번째 ListBox의 항목을 반복하고 두 번째 목록 상자에 각 항목을 등록하면됩니다.

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