본문 바로가기
개발언어/ASP.NET

[에러] 잘못된 다시 게시 또는 콜백 인수입니다.

by 엔돌슨 2008. 4. 24.
반응형


에러가 난다. ajax의 유효성 검사때문에 나는 것인거 같다.


잘못된 다시 게시 또는 콜백 인수입니다. 이벤트 유효성 검사는 구성의 <pages enableEventValidation="true"/> 또는 페이지의 <%@ Page EnableEventValidation="true" %>를 사용하여 활성화됩니다. 이 기능은 다시 게시 또는 콜백 이벤트에 대한 인수가 원래 이들을 렌더링한 서버 컨트롤에서 발생하는지 확인하여 보안을 유지합니다. 데이터가 올바르면 유효성 검사에 대한 다시 게시 또는 콜백 데이터를 등록하는 데 ClientScriptManager.RegisterForEventValidation 메서드를 사용합니다.


해결책은 퍼왔다.
http://www.bangsil.pe.kr/Board/Read.aspx?BoardId=da05ba1b-3e9b-4d16-b8f8-ff2e4f7514c5&PostId=e5d11f50-7bad-44e9-b1d2-e2384a40a4c0

잘못된 다시 게시 또는 콜백 인수입니다. 이벤트 유효성 검사는 구성의 <pages enableEventValidation="true"/> 또는 페이지의 <%@ Page EnableEventValidation="true" %>를 사용하여 활성화됩니다. 이 기능은 다시 게시 또는 콜백 이벤트에 대한 인수가 원래 이들을 렌더링한 서버 컨트롤에서 발생하는지 확인하여 보안을 유지합니다. 데이터가 올바르면 유효성 검사에 대한 다시 게시 또는 콜백 데이터를 등록하는 데 ClientScriptManager.RegisterForEventValidation 메서드를 사용합니다.

음 자유게시판에 질문 하신분이 있어 해당문제에 대하여 좀 찾아 보았다.

 

방실님의 AjaxControlToolkit 예제를 보고 테스트 하면서 발견한 버그(?) 같은건데 어떻게 처리해야 할지 몰라서 이렇게 글로 남깁니다.

하단에 임의의 버튼을 만들고 CascadingDropDown 로 드롭다운리스트를 선택한 상태에서 그 버튼을 눌러서 이벤트를 발생시키면 "잘못된 다시 게시 또는 콜백 인수입니다."라는 에러가 납니다.

드롭다운리스트를 선택하지 않은 상태에서 버튼을 클릭할 시에는 정상적으로 이벤트가 작동합니다.

이유와 해결방안을 알려주시면 고맙겠습니다.

감사합니다. ^^

물론 오류 내용으로 보아 해당 속성을 false로 설정하면 되겠지만.
이는 유효성 검사를 하지 않는다는 것을 의미 하기 때문에 보안상의 문제가 있을것이다.
별루 아름답지도 않아 보이고..ㅡ.ㅡ;

아래 토픽을 읽어 보기 바란다.

http://forums.asp.net/p/945348/1139510.aspx

http://odetocode.com/Blogs/scott/archive/2006/03/20/3145.aspx

http://odetocode.com/Blogs/scott/archive/2006/03/21/3153.aspx

읽어 보면 알겠지만..
상당한 노가다성 코드가 들어 간다.
그 내용은 아래와 같다..

protected override void Render(HtmlTextWriter writer)

{

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "1");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "2");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "3");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "4");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "5");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "6");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "7");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "8");

  this.Page.ClientScript.RegisterForEventValidation(this.DropDownList1.UniqueID, "9");

  base.Render(writer);

}


맨 마지막 토픽을 읽어 보면 알겠지만.
페이지 혹은 사이트 전체적으로 유효성 검사를 끄는 기능은 EnableEventValidation  속성의 설정으로 가능하나.
부분적인 컨트롤에서의 설정을 해제하는 부분은 없다.
그럴 경우에는  위 예제 처럼 해당 컨트롤을 상속 받아서 만들어야 한다.

SupportsEventValidationAttribute 라는 특성은 클래스단에서만 정의되며 이 특성을 사용하여 클래스를 만들면 되겠다.

  [SupportsEventValidationAttribute]

  public class ExDropDownList :DropDownList

  {

    protected override void Render(HtmlTextWriter writer)

    {

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "1");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "2");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "3");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "4");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "5");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "6");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "7");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "8");

      this.Page.ClientScript.RegisterForEventValidation(this.UniqueID, "9");

      base.Render(writer);

    }

  }

페이지에서 코딩을 하던 컨트롤을 만들던..
오버로드된 RegisterForEventValidation 메서드중에서 RegisterForEventValidation(string, string) 타입만 사용이 가능했다..(테스트 해본 결과..)
그 이유는 알 수 없으나..이렇게 된다면.
유효한 데이터를 일일이 타이핑을 해줘야 한다는 결론이 난다..ㅡ.ㅡ;
내용을 보면 DropDownList컨트롤에 바인딩되어 콜백되는 값(DDL의 Value 속성의 값)을 등록(Register)한 것이다.

자..이제 선택의 기로에 서있다..ㅡ.ㅡ;
일일이 등록할 것이가..아니면 페이지에서 유효성 검사를 사용하지 않을것인가..?

그렇다면...
선택은..결국 해당 페이지만..EnableEventValidation 속성 값을 false로 주는 것 밖에 없어 보인다..ㅡ.ㅡ;

PS  박상현님 답변이 되었는가요??