2008-10-17 5 views
5

2 개의 목록 상자와 두 개의 목록간에 항목을 서로 바꿀 수있는 몇 개의 단추로 구성된 항목 swapper 컨트롤을 만들었습니다. 스와핑은 javascript를 사용하여 수행됩니다. 또한 목록에서 항목을 위아래로 이동합니다. 기본적으로 오른쪽의 목록 상자로 항목을 이동할 때 요소 (GUID)의 데이터 키를 숨겨진 필드에 저장합니다. 포스트 백에서는 필드에서 GUID를 읽습니다. 모든 것이 잘 작동하지만 다시 게시 할 때 다음 예외가 발생합니다.JavaScript로 재 배열 된 ListBox 요소로 인해 다시 게시시 이벤트 유효성 검사 오류가 발생했습니다.

잘못된 포스트 백 또는 콜백 인수. 이벤트 유효성 검사는 구성 또는 < % @ Page EnableEventValidation = "true"%>를 사용하여 활성화됩니다. 보안상의 이유로이 기능은 포스트 백 또는 콜백 이벤트에 대한 인수가 원래 렌더링 된 서버 컨트롤에서 비롯된 것인지 확인합니다. 데이터가 유효하고 예상되는 경우 유효성 검사를 위해 다시 게시 또는 콜백 데이터를 등록하려면 ClientScriptManager.RegisterForEventValidation 메서드를 사용합니다.

테스트 응용 프로그램을 준비했습니다. 아카이브를 다운로드하고 프로젝트를 실행하기 만하면됩니다. 웹 페이지에서 3 항목을 선택하고 모두 추가를 누른 다음 세 번째 요소를 한 수준 위로 이동 한 다음 "버튼"을 누릅니다. 오류가 표시됩니다. 이벤트 유효성 검사를 끄는 것은 결코 용인 할 수없는 방법입니다. 누구든지 나를 도울 수 있습니까? 솔루션을 찾지 않고 이미 2 일을 보냈습니다. 이 렌더링 할 때 목록에서 선택한 항목이 목록에 존재하지 않았기 때문에

TEST APPLICATION

+0

는 참고 : 나는 당신의 응용 프로그램을 다운로드하고이 오류가 없었어 - 나는, 그러나, COL1은 데이터 테이블, 또는 그런 일 (지금 그것을보고하지 않음)의 일부가되지 않는 대해 오류가 발생했습니다. 나에게 적합하지 않기 때문에 예제에서이 오류가 발생하는지 확인하고 싶을 수 있습니다. –

+0

또한 '움직이는'앞뒤가 파이어 폭스에서 전혀 작동하지 않는다는 것을 언급하거나 수정하고 싶을 수도 있습니다. –

+0

col1의 오류는 destinationDT.Columns.Add ("colUID", typeof (Guid))로 인해 발생합니다. 및 destinationDT.Columns.Add ("col1", typeof (string)); 포스트 백이 아닌 경우에만 호출되지만 버튼을 클릭 할 때 필요합니다. – Aleris

답변

0

첫 번째 옵션은 상당한 오버 헤드를 가져옵니다. 그러나 관련된 모든 위험이있는 대신 내 사용자 컨트롤의 일반 목록 상자의이 문제를 해결 사용

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

: 나는 목록 상자 클래스에서 파생 된 내 자신의 사용자 지정 목록 상자 컨트롤을 정의하고 loadpostback 데이터의 재정의를 수행 한 내 접근 방식?

+0

이 작업을 수행하는 경우 false를 반환하려고합니다. true를 반환하면 SelectedIndexChanged가 항상 실행되지만, 후속 데이터에서 SelectedIndex를 채우는 비트가 재정의되었으므로 실제로 변경되지 않습니다. – stevemegson

0

그것은 불평. AJAX를 통해 PageMethods를 사용하여 PostBack 대신 양식으로 데이터를 가져 오는 것이 좋습니다. 또는 비 입력 컨트롤을 사용하여 목록 요소를 앞뒤로 이동시키는 순서없는 목록과 같은 데이터를 저장할 수 있습니다. 필요한 경우 얻을 수있는 목록 요소 안에 숨겨진 범위에 GUID를 넣을 수 있습니다.

+0

그러나 단순히 요소를 왼쪽의 목록에서 오른쪽의 요소로 이동 한 다음 순서를 변경하지 않고 다시 게시하면 모든 항목이 정상적으로 작동합니다. 이 경우 페이지를 쓰는 것과 비교했을 때 포스트 백에서 두 목록이 다른 것은 아닌지 확인하십시오. – kjv

+0

좀 더 정확하게 말하자면, 목록에 선택된 값은 페이지가 작성되었을 때 목록에 나타나지 않았기 때문에 불평합니다. 항목을 추가해도 문제가 없지만 순서를 변경하면 항목이 선택되어 문제가 발생합니다. – stevemegson

+0

문제에 대한 설명이 수정되었습니다. – tvanfosson

3

문제는 목록의 저장된보기 상태와 다시 게시시받은 데이터가 일치하지 않는다는 것입니다. 이벤트 유효성 검사 문제는이 방법으로 인해 발생할 수있는 가능한 문제 중 하나 일 가능성이 큽니다. webforms의 아키텍처는 이런 종류의 사용을 허용하지 않으며, 이벤트 확인 문제를 피하기 위해 성공하더라도이 접근법에 더 많은 문제가있을 수 있습니다. 몇 가지 대안이 있습니다 :

1) 가장 간단한 방법은 자바 스크립트를 사용하는 대신 서버에서 스왑 논리를 수행하는 것입니다. 이렇게하면 뷰 상태가 포스트 백간에 유지되고 서버로의 다중 왕복 이동의 추가 오버 헤드가 문제가되지 않을 수 있습니다.

2) 서버로의 다중 왕복 이동이 문제인 경우 자체 뷰 상태를 처리하는 서버 컨트롤을 작성하십시오. 이것은 물론 많은 참여 방법입니다.

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

진지한 논쟁이 없다면 1로 갈 것입니다.

1

몇 가지 가능한 옵션 :

  • 가능하면이 두 목록에의 ViewState를 해제합니다. ViewState가 없으면 서버는 원래 값이 무엇인지 알 수 없으므로 오류가 발생하지 않습니다. 이 방법을 사용하면 목록을 다시 채워야하며 (ViewState가 없기 때문에) 수동으로 선택 항목을 추적해야하거나 OnInit 단계에서 목록을 채워야합니다. (당신이 할 수있는 경우)

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

  • 이벤트 유효성 검사를 해제

    .

0

우연히 이미 시도해 보셨습니까? 당신이 어떤 식 으로든 목록에 빠졌을 때마다 이것을하십시오.

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

또는 ListBox 대신 서버 쪽 HtmlSelect를 사용하여 이벤트 유효성 검사 문제를 해결할 수 있습니다. 무엇보다도, 코드 숨김의 대부분을 그대로 남겨 둘 수 있습니다 (예 : 목록 채우기 논리는 ListBox와 동일합니다).

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

모든 가능한 목록 상자 항목을 두 목록 상자에 모두 등록하려면 Render 이벤트를 재정의 할 수 있습니다. 어떤 식으로 항목을 옮기더라도 유효성 검사는 그 방법을 기대합니다.

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