문제

두 개의 목록 상자와 두 개의 목록 사이에 항목을 바꿀 수있는 일부 버튼으로 구성된 항목 SWAPPER 컨트롤을 만들었습니다. 교환은 JavaScript를 사용하여 수행됩니다. 또한 목록에서 항목을 위아래로 움직입니다. 기본적으로 오른쪽의 목록 상자로 항목을 이동할 때 Hiddenfield에 요소 (Guids)의 Datakeys를 저장합니다. 포스트 백에서 나는 단순히 현장에서 안내를 읽습니다. 모든 것이 잘 작동하지만 포스트 백에서는 다음과 같은 예외를 얻습니다.

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

테스트 응용 프로그램을 준비했습니다. 아카이브를 다운로드하고 프로젝트를 실행하기 만하면됩니다. 웹 페이지에서 3 개의 항목을 선택하고 모든 추가를 누른 다음 세 번째 요소를 한 레벨 위로 이동 한 다음 "버튼"을 누르십시오. 오류가 나타납니다. 이벤트 유효성 검사를 끄는 것은 결코 허용되지 않습니다. 누구든지 나를 도울 수 있습니까, 나는 이미 해결책을 찾지 않고 이미 이틀을 보냈습니다.

시험 적용

도움이 되었습니까?

해결책 3

첫 번째 옵션은 상당한 오버 헤드를 가져옵니다. ListBox 클래스에서 파생 된 내 자신의 사용자 정의 목록 상자 컨트롤을 정의하고 LoadPostback 데이터를 재정의했습니다.

public class CustomListBox : ListBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        return true;
    }
}

내 사용자 컨트롤에서 일반 ListBox 대신에 이것을 사용하면 문제가 해결되었지만 내 접근 방식과 관련된 위험이 있습니까?

다른 팁

문제는 목록의 저장된 뷰 상태와 Postback에서 수신 된 데이터가 일치하지 않는다는 것입니다. 이벤트 검증 문제는이 접근법으로 인해 나타날 수있는 가능한 문제 중 하나 일 가능성이 높습니다. WebForms의 아키텍처는 이러한 종류의 용도를 허용하지 않으며, 이벤트 유효성 검사 문제를 피하기 위해 성공 하더라도이 접근법에 더 많은 문제가있을 가능성이 높습니다. 몇 가지 대안이 있습니다.

1) 가장 간단한 것은 JavaScript를 사용하는 대신 서버에서 스왑 로직을 수행하는 것입니다. 이런 식으로 뷰 상태는 포스트 백 사이에 보존되며 서버로의 여러 라운드 트립의 추가 오버 헤드는 문제가되지 않을 수 있습니다.

2) 서버로의 여러 라운드 트립이 문제 인 경우 자체 뷰 상태를 처리하는 서버 컨트롤을 작성하십시오. 이것은 물론 많은 매력적인 접근법입니다.

3) 중간 접지 접근 방식은 두 개의 간단한 HTML 목록을 사용하고 (ASP.NET 컨트롤을 사용하지 않고 HTML 태그 만 작성하고) javaScript에서 클라이언트 측에서 숨겨진 필드에있는 ID 목록을 유지하는 것입니다. 포스트 백에서 숨겨진 필드를 구문 분석하고 HTML 목록을 무시한 ID를 추출하십시오.

그것에 대한 심각한 주장이 없다면 나는 1과 함께 갈 것입니다.

몇 가지 가능한 옵션 :

  • 가능하면 두 목록에서 ViewState를 비활성화하십시오. ViewState가 없으면 서버는 원래 값이 무엇인지 알 수 없으므로 오류가 아닙니다. 이 접근법을 사용하면 (ViewState 부족으로 인해) 목록을 다시 채워야하며 선택을 수동으로 추적해야하거나 Oninit 단계에서 목록을 채워야합니다.

  • 이벤트 유효성 검사를 끄십시오 (가능하다면)

  • 서버쪽에 두 목록을 완전히 채우고 클라이언트 측 스크립트 (JavaScript)를 사용하여 필요에 따라 두 목록에서 항목을 제거하십시오.

우연히, 당신은 이미 이것을 시도 했습니까? 어떤 식 으로든 목록에 푹 빠질 때마다 이렇게하십시오.

document.getElementById("listbox").selectedIndex = -1;

목록에서 선택한 항목이 렌더링 될 때 목록에 존재하지 않았기 때문에 불만입니다. Ajax를 통해 Pagemethods를 사용하여 Postback 대신 양식으로 데이터를 다시 가져 오십시오. 또는 비 입력 컨트롤을 사용하여 데이터를 보유합니다. 목록 요소를 앞뒤로 움직이는 순서 대표 목록과 같이 데이터를 보유하십시오. 필요한 경우리스트 요소 내부에 숨겨진 스팬에 안내서를 넣을 수 있습니다.

또는 ListBox 대신 서버 측 HTMLSelect를 사용하여 이벤트 유효성 검사 문제를 해결할 수 있습니다. 무엇보다도, 당신은 코드-비만의 많은 부분을 그대로 남길 수 있습니다 (예 : 목록 인구 논리는 ListBox와 동일합니다).

<select runat="server" id="myList" multiple="true" />

렌더 이벤트를 무시하여 가능한 모든 ListBox 항목을 두 ListBox에 등록 할 수 있습니다. 이렇게하면 어떤 항목이 이동하든, 유효성 검사가 기대하고 있습니다.

protected override void Render(HtmlTextWriter writer)
{
  foreach (DictionaryEntry entry in ColumnConfig) {          
    Page.ClientScript.RegisterForEventValidation(lstbxColumnsToExport.UniqueID,(string)entry.Key);
    Page.ClientScript.RegisterForEventValidation(lstbxNonExportColumns.UniqueID,(string)entry.Key);
  }
  base.Render(writer);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top