잘못된 포스트백 또는 콜백을 인수입니다.이벤트 검사를 사용하여 사용 가능'<pages enableEventValidation="“true”/" />'

StackOverflow https://stackoverflow.com/questions/228969

문제

나는 다음과 같은 오류가 게시하면 페이지에서 클라이언트 측.I have JavaScript 코드 수정하는 asp:목록 상자에서 클라이언트 측.

우리는 어떻게 이 문제를 해결?

아래의 오류 정보:

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 이이 추가 또는 제거 된 ListItem에 대해 알지 못한다는 것입니다. 여러 옵션이 있습니다 (아래 나열) :

  • EventValidation을 비활성화합니다 (비용이 거의없는 보안을 잃어 버리기 때문에 나쁜 생각).
  • asp.net ajax updatepanel을 사용하십시오. (ListBox를 업데이트 패널에 넣고 ListBox를 추가하거나 제거하는 경우 업데이트를 트리거합니다.이 방법으로 ViewState 및 관련 필드가 업데이트되고 EventValidation이 통과됩니다.)
  • 클라이언트 측을 잊고 클래식 포스트 백을 사용하고 ListItems 서버 측을 추가하거나 제거하십시오.

이게 도움이 되길 바란다.

다른 팁

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

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

이 오류는 명령을 클릭하면 Page_Load가 다시 실행될 때 발생합니다. 일반 수명주기에서 Page_LOAD-> 명령을 클릭하십시오 -> page_load (Again) -> 프로세스 항목 command event.

Datagrid에 대한 경험이있었습니다. 열 중 하나는 "선택"버튼입니다. 행의 "선택"버튼을 클릭 할 때이 오류 메시지를 받았습니다.

"잘못된 포스트백 또는 콜백 인수. 이벤트 유효성 검사는 페이지에서 구성 또는 < %@ page enableEventValidation ="true " %>에서 사용하여 활성화됩니다. 보안 목적 으로이 기능은 Postback 또는 콜백 이벤트에 대한 인수가 서버 컨트롤에서 발생하는지 확인합니다. 데이터가 유효하고 예상되는 경우 ClientScriptManager.registerforeventValidation 메서드를 사용하여 유효성 검사를 위해 Postback 또는 Callback 데이터를 등록하려면 "원래 렌더링되었습니다."

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

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 클라이언트 측에 항목을 추가하는 데는 두 가지 주요 문제가 있습니다.

  • 첫 번째는 이벤트 검증을 방해한다는 것입니다. 서버로 돌아온 것은 보낸 내용이 아닙니다.

  • 두 번째는 이벤트 유효성 검사를 비활성화하더라도 페이지가 ListBox의 항목을 다시 게시하면 ViewState에서 재건되므로 클라이언트에 대한 변경 사항이 손실된다는 것입니다. 그 이유는 ASP.NET이 클라이언트에서 ListBox의 내용을 수정할 것으로 기대하지 않기 때문에 선택을 할 것으로 예상되므로 변경 사항을 폐기합니다.

가장 좋은 옵션은 권장 된대로 업데이트 패널을 사용할 가능성이 높습니다. 또 다른 옵션은이 클라이언트 쪽을 실제로 수행 해야하는 경우 평범한 구식을 사용하는 것입니다. <select> 대신 <asp:ListBox>, 당신의 아이템 목록을 숨겨진 필드에 보관합니다. 페이지가 클라이언트의 페이지를 렌더링하면 텍스트 필드 내용 분할에서이를 채울 수 있습니다.

그런 다음 게시 할 준비가되면 수정 된 필드의 내용을 다시 채 웁니다. <select>. 물론, 서버에서 다시 분할하고 항목으로 무언가를해야합니다. 이제 SELECT가 서버에 다시 돌아 왔기 때문에 비어 있기 때문입니다.

대체로 권장하지 않는 매우 번거로운 솔루션이지만 ListBox의 클라이언트 측 수정을해야한다면 작동합니다. 그러나이 경로를 가기 전에 업데이트 패널을 살펴 보는 것이 좋습니다.

EnableEventValidation이 켜진 웹 사이트에서 리피터 컨트롤이있는 웹 페이지가 있었기 때문에 리피터와 같은 문제가있었습니다. 좋지 않았습니다. 나는 유효하지 않은 Postback 관련 예외를 얻고있었습니다.

저를 위해 일한 것은 리피터를 위해 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 문서 자체에 중첩 된 프레임에 양식 태그가 포함 된 양식 태그 내에서 iframes를 고려하기 시작했습니다. 이 오류를 피하기 위해 iframe을 양식 태그에서 옮겨야했습니다.

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

내가 찾은 수정은 클라이언트로부터 추가 할 수있는 모든 유효한 항목을 이벤트 유효성 검사 시스템에 알리는 것입니다. page.render를 재정의하고 page.clientscript.registerforeventValidation javaScript가 목록 상자에 추가 할 수있는 각 값에 대해이를 수행합니다.

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

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

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

여기에 언급되지 않은 다른 방법 중 하나는 Subclass Listbox입니다.

즉.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation 키 속성 시스템을 벗어납니다 .web.ui.supportSeventValidation 서브 클래스를 사용하면 명시 적으로 추가하지 않으면 유효성 검사 루틴을 호출하지 않습니다. 그것은 모든 컨트롤과 함께 작동하며 제어 기준 (예 : 페이지 레벨이 아닌)으로 제어하여 "비활성화"하는 유일한 방법입니다.

3 : 그리드 열의 버튼 유형을 "pushbutton"에서 "linkbutton"으로 변경했습니다. 효과가 있었다! ( "buttontype ="linkbutton ") 버튼을"LinkButton "과 같은 다른 컨트롤로 변경할 수 있다면 올바르게 작동한다고 생각합니다.

나는 당신에게 투표 할 수 있기를 바랍니다. 아미르 (아쉽게 내 담당자가 너무 낮습니다) 나는이 문제를 겪고 있었고 이것을 바꾸는 것은 내 그리드 뷰의 챔피언처럼 효과가있었습니다. 조금 옆으로, 유효한 코드는 : buttontype = "link"라고 생각합니다.

'편집'을 클릭하면 편집이 '업데이트'및 '취소'로 변경되어 제출시 '편집'으로 다시 변경되기 때문입니다. 이러한 변화하는 컨트롤은 .NET가 불안합니다.

(1) enableEventValidation = "false"................... 그것은 나에게 효과가 없습니다.

(2) clientscript.registerforeventValidation .... 그것은 나에게 효과가 없습니다.

Solution 1:

gridview의 링크 버튼으로 버튼/ImageButton을 변경하십시오. 효과가있다. (하지만 나는 imagebutton을 좋아한다)

연구 : Button/ImageButton 및 LinkButton은 다른 방법을 사용하여 포스트 백

원본 기사 :

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

Solution 2:

OnInit ()에서 버튼/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/

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

추가하다

enableEventValidation = "false"

당신은 어떤 질문이든 자유롭게 물어보십시오!

를 작성하는 경우 추가 다운 목록을 통해 클라이언트 측의 스크립트는 다음 명확한 목록하기 전에 양식을 제출하시하는 서버;다음 ASP.NET 불평하지 않을 것이며 보안이 될 수 있습니다.

과 데이터를 얻을 수있는에서 선택한 DDL,첨부할 수 있습니다"항상"이벤트 DDL 수집하는 값에서 숨겨진 입력 또는 텍스트 상자 Style="display:none;"

중첩 그리드보기를 구현했으며 같은 문제에 직면했으며 이미지 버튼 대신 링크 버튼을 사용했습니다.

다음과 같은 열이 있기 전에 :

<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.NET 1.1을 사용하거나 JavaScript를 통해 컨트롤을 업데이트하지 않았습니다. 내 문제는 Firefox에서만 발생했지만 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"(Hiddenfield)는 다음과 같이 Newline에 의해 분리 된 옵션이있었습니다.

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

문제는 드롭 다운을 나타내는 "Select"옵션에서 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" />

나는 같은 문제를 겪었습니다.

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

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

코드 추가 :

If(!IsPostBack){

 //do something

}

이 경우 그리드의 행위 방향에있는 버튼에 ID를 추가하십시오. 그것은 당신의 문제를 해결할 것입니다.

이 문제에 대한 간단한 해결책은 ISPOSTBACK 페이지로드를 확인하십시오. 그것은이 문제를 해결할 것입니다.

Ajax UpdatePanel 그것을 만들고, 나는 그것이라고 생각합니다 가장 쉬운 방법, 무시 Ajax Postback 간접비.

나는 이것이 오래된 게시물이라는 것을 알고 있습니다. 당신이 당신의 응용 프로그램에 전화를한다고 가정하면, 다음은 나를 위해 일한 아이디어가 있습니다.

  1. 페이지에서 icallbackeventhandler를 구현하십시오
  2. 서버 사이드 코드를 호출하려면 clientscriptmanager.getCallBackeVentReference를 호출하십시오
  3. 오류 메시지가 표시된대로 ClientScriptManager.registerforeventValidation을 호출 할 수 있습니다.

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

일반 ASPX 페이지를 콘텐츠 페이지로 변환 할 때 동일한 문제에 도달했습니다.

이 문제가있는 페이지에는 a가있었습니다 </form> 컨텐츠 섹션 중 하나 내에 태그가 있으므로 실행 시간에 두 가지 양식 엔드 태그가 렌더링 되어이 문제를 일으켰습니다. 페이지에서 추가 양식 엔드 태그를 제거하면이 문제가 해결되었습니다.

4 분 전에 나는 같은 오류를 받았다. 그런 다음 나는 당신처럼 30 분 동안 연구했습니다. 모든 포럼에서 그들은 일반적으로 "add page enableevent .. = false 또는 true"라고 말합니다. 제안 된 해결책은 내가 찾을 때까지 내 문제를 해결하지 못했습니다. 불행히도 문제는 ASP.NET 버튼입니다. 나는 2 초 전에 그것을 제거했다. "ImageButton"으로 바꾸려고했지만 동일한 오류가 발생했기 때문에 용납 할 수 없었습니다.

마침내 나는 교체했다 LinkButton. 작동하는 것 같습니다!

Datalist를 사용하고 있었고 푸시 버튼에 대해 동일한 오류가 발생했습니다. 나는 단지 ispostback을 사용하여 컨트롤을 확인하고 채우면 문제가 해결됩니다! 엄청난!!!

저를 위해 일한 것은 다음 코드를 page_load에서 page_prerender로 옮기는 것입니다.

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> 태그와 내부는 버튼 또는 컨트롤을 트리거하여 Postback을 사용하여 <asp:PostBackTrigger .../>

채워질 수있는 데이터를 앞쪽으로 알고 있다면 ClientScriptManager를 사용 하여이 문제를 해결할 수 있습니다. 이전 사용자 선택에서 JavaScript를 사용하여 드롭 다운 상자를 동적으로 채울 때이 문제가 발생했습니다.

다음은 렌더 메소드 (VB 및 C#)를 재정의하고 DropDownList 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에 대해 모두 재미있게됩니다.

그래서 내가 한 일은 양식을 서버에 다시 제출하기 전에 모든 목록 옵션을 지우는 것입니다. 그렇게하면 목록이 클라이언트에게 비어 있고 비어있는 이후로 서버가 불만을 제기하지 않았습니다.

정렬 !!!

Nick B가 말했듯이 저에게 효과가 있듯이 어떤 경우에는 라인 브레이크를 제거해야합니다. 코드를 살펴보십시오.

-잘못된 방법:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

-오른쪽 방법 :

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

그것은 IE10+에서 나에게만 나에게만 OCUREVERDER

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top