문제 설명 : 이것은 많은 ASP.NET 초보자가 직면하고 게시하고 묻는 공통된 문제 중 하나입니다. 일반적으로 다음과 같이 오류 메시지를 게시하고 수행하려고 시도한 내용에 대해 많이 공유하지 않고 해결 방법을 찾습니다.
[ArgumentException : 잘못된 포스트 백 또는 콜백 인수입니다. 이벤트 유효성 검사는 구성 또는 < % @ Page EnableEventValidation = "true"%>를 사용하여 활성화됩니다. 보안상의 이유로이 기능은 포스트 백 또는 콜백 이벤트에 대한 인수가 원래 렌더링 된 서버 컨트롤에서 비롯된 것인지 확인합니다. 데이터가 유효하고 예상되는 경우 유효성 검사를 위해 다시 게시 또는 콜백 데이터를 등록하려면 ClientScriptManager.RegisterForEventValidation 메서드를 사용합니다.]
오류 스택 추적 자체는 이벤트 유효성 검사를 해제하여 빠른 해결 방법을 제안하지만 보안 구멍을 열 때 권장되는 솔루션은 아닙니다. 왜 그런 일이 발생했는지, 그리고 그 근본 문제를 해결하고 처리하는 방법을 알고있는 것이 좋습니다.
평가 : 이벤트 원본은 이벤트의 원본이 관련 렌더링 된 컨트롤인지 (일부 크로스 사이트 스크립트가 아닌) 유효성을 검사하기 위해 수행됩니다. 컨트롤은 렌더링 중에 이벤트를 등록하기 때문에 포스트 백 또는 콜백 중에 (__doPostBack의 인수를 통해) 이벤트를 확인할 수 있습니다. 이렇게하면 권한이 없거나 악의적 인 포스트 백 요청 및 콜백의 위험이 줄어 듭니다.
참조 : MSDN : Page.EnableEventValidation 재산권
상기 내용을 토대로, 내가 직면 또는 토론에서 문제를 제기하는 들었다 가능한 시나리오는 다음과 같습니다 사례 # 1 : 우리가 요청 데이터의 각 괄호가있는 경우 , 일부 스크립트 태그가 서버로 전달되는 것처럼 보입니다.
가능한 해결 방법 : HTML은 ">"
function HTMLEncodeAngularBrackets(someString)
{
var modifiedString = someString.replace("<","<");
modifiedString = modifiedString.replace(">",">");
return modifiedString;
}
사례 # 2 "<"와 ">"와 "<"을 대체, 즉, 양식을 제출하기 전에 자바 스크립트의 도움으로 각 브래킷을 인코딩 : 런타임에 클라이언트에서 컨트롤을 변경하는 클라이언트 스크립트를 작성하면 매달리는 이벤트가 발생할 수 있습니다. 내부 컨트롤이 포스트 백을 위해 등록하지만 외부 컨트롤에서 수행되는 작업으로 인해 런타임시 숨겨지는 예제가 포함 된 컨트롤을 가질 수 있습니다. Carlo가 쓴 MSDN 블로그에서 여러 가지 양식 태그 때문에 같은 문제를 찾을 때 읽었습니다.
가능한 해결 방법 : 페이지의 Render 메서드 내에서 이벤트 유효성 검사를위한 컨트롤을 수동으로 등록하십시오.
protected override void Render(HtmlTextWriter writer)
{
ClientScript.RegisterForEventValidation(myButton.UniqueID.ToString());
base.Render(writer);
}
으로합니다 (이 같은 범주에 폭포 모양)보고 다른 일반적인 시나리오 중 하나가 하나 개의 양식 태그는 서버에서 실행되는 또 다른 형태의 태그에 포함 된 페이지를 구축했다. 그 중 하나를 제거하면 플로우가 정정되고 문제점을 해결합니다.
사례 3 : 모든 포스트 백에서 런타임에 컨트롤 또는 명령을 재정의하거나 인스턴스화하면 해당/관련 이벤트가 토스로 갈 수 있습니다. 간단한 예제는 모든 페이지로드 (포스트 백 포함)에서 DataGrid를 다시 바인딩하는 것입니다. 다시 바인딩 할 때 그리드의 모든 컨트롤에 데이터 ID 컨트롤이 트리거 된 이벤트가 발생하면 포스트 백에서 컨트롤 ID가 변경되므로 이벤트가 올바른 컨트롤에 연결되지 않아 문제가 발생하지 않을 수 있습니다.
가능한 해결 방법 : 이 작업은 컨트롤이 모든 포스트 백 (여기에서 다시 바인딩)에서 다시 만들어지지 않도록 간단하게 해결할 수 있습니다. Page 속성 IsPostback을 사용하면 쉽게 처리 할 수 있습니다. 모든 포스트 백에 대한 컨트롤을 만들려면 ID가 변경되지 않았는지 확인해야합니다.
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostback)
{
// Create controls
// Bind Grid
}
}
결론 : 으로 쉬운/직접 솔루션은 Page 지시문 또는 Web.config 파일에 enableEventValidation이 = "false"를 추가 할 수 있지만 사용하지 않는 것이 좋습니다 말했다. 구현 및 원인을 기반으로 근본 원인을 찾아 적절하게 해결하십시오.
페이지에서 ASP.Net AJAX를 사용하고 있습니까? – JasonS
예 ASP.NET AJAX를 사용하고 있습니다. – jwarzech