2009-11-19 3 views
0

서문 : 처음에는 JavaScript + jQuery를 처음 사용했기 때문에 내 문제는 이해가 부족할 가능성이 높습니다. - 내가 버튼을 클릭하면 항목을 하나 개의 목록 이동에 다른 사용자가 예상하는대로jQuery를 사용한 후에 ListBox에 추가되지 않는 항목 .appendTo

$('[id$=AddRole]').click(function() { 
    $('[id$=MissingRoles] option:selected').appendTo('[id$=Roles]'); 
    return false; 
}); 

$('[id$=RemoveRole]').click(function() { 
    $('[id$=Roles] option:selected').appendTo('[id$=MissingRoles]'); 
    return false; 
}); 

이 훌륭하게 작동합니다

내가

는 매우 간단한 자바 스크립트가 다른 하나 개의 목록 상자에서 요소를 이동해야합니다. 환상적! 그러면 버튼이 클릭되어 다시 게시됩니다. 내 코드의 if (IsPostBack) 섹션에서 'Roles'ItemCollection을 추출하고 내가 추가 한 새 항목을 볼 수 있다고 가정하고 각 항목을 인쇄합니다. 슬프게도, 나는 DataBound였던 원래 아이템만을리스트에 추가한다. IsPostBack 섹션에 실수로 DataBind가 없으므로 단순히 바인딩 만하는 것이 아닙니다.

나는 여기서 한 발자국을 놓치고 있다고 가정하고 있습니다. 실제로 .NET에 ListBox의 내용을 업데이트하도록 지시 할 필요가 있습니까? jQuery가하는 일이 순수하게 미학적 인 것 같지만 컨트롤에 변경 사항을 적용하는 방법을 놓치고 있습니다.

답변

2

실제로이 제한은 .NET에서 모든 것이 처음 제공된 방식대로 유지된다고 가정하기 때문에 발생합니다. 사이트가 텍스트 상자를 렌더링하면 값이 변경되었을 수 있음을 알게되고 POST 데이터를 기반으로 값을 업데이트합니다. 예를 들어 비활성화 된 텍스트 상자를 렌더링하는 경우 값을 변경할 수 없다는 것을 "알고 있습니다". 따라서 자바 스크립트가 텍스트 상자를 사용하도록 설정 한 경우에도 변경된 텍스트를 가져올 수 없습니다.

여기에서도 동일한 문제가 발생합니다. .NET은 항목이 어떤 목록에 속해 있는지 이미 알고 있다고 가정합니다. 선택한 값은 항상 Request.Form 컬렉션에 게시되므로 .NET 목록 상자 컨트롤의 값이 변경되지 않더라도 그 방법으로 (Request.Form[myListBox.ClientID]) 값을 가져올 수는 있지만 값은 목록 상자에서 선택되지 않은 양식 데이터는 양식 데이터로 전달되지 않으므로 실제로 제출하기 전에 서버가 목록 상자를 변조 한 방법을 서버가 알 수있는 방법이 없습니다.

당신이해야 할 일은별로 예쁘지 않지만 그것이 유일한 방법입니다. 데이터를 이동하는 두 가지 기능 모두에서 숨겨진 필드를 업데이트해야합니다. 각 목록 상자에 대한 하나의 숨겨진 필드이거나 모든 목록 상자 항목의 쉼표로 구분 된 값, 모든 목록 상자의 파이프 구분 목록 또는 데이터 표시 방법 중 하나를 포함하는 숨겨진 필드 일 수 있습니다. 하루에 실제로 다른 목록 상자에있는 데이터의 문자열 표현을 수동으로 만들어야하며, 서버 측에서 픽업하여 목록 상자를 새로운 관련 데이터로 다시 바인딩해야합니다.

+0

설명해 주셔서 감사합니다. 나는 미래의 좌절감을 위해 이것을 북마크해야 할 것이다. Mark가 제안한 것을 수행하게 될 가능성이 높습니다. 원래 이것이 의도했던대로였습니다. – abx1947

+0

나는 그것을 강조하지 말라는 것을 분명히 말하지만, 그것은 물론 당신 자신의 선택입니다. 나는 updatepanels을 절대적인 가증이라고 생각한다. ajax.net이 실제로 비동기 적이라는 것을 알고 있습니까? 더 나쁜 것은 전체 페이지가 실제로 렌더링되고 관련 부분 만 다시 전송된다는 것입니다. 당신은 또한 전체 viewstate를 전달해야한다. 이것은 현재 동작이 요구하는 것보다 많을 수있다. 그리고 최악의 경우, 어쨌든 발생할 포스트 백에서 정보를 전달하는 대신 모든 변경 사항에 대해 서버 호출을해야합니다. –

0

asp.net을 사용하는 경우 나는 viewstate를 조작하지 않기 때문에 이것을 믿습니다. 그리고 이것은 렌더링 할 포스트 백에서 asp.net 서버에 중요합니다.

간단히 말해서 UpdatePanel을 사용하여 컨트롤을 래핑하는 것이 좋습니다. Asp.net은 Ajax 유형의 훌륭한 기능을 이미 내장하고 있으며 전체 포스트 백이 필요하지 않습니다. 그들의 논리는 모든 mangling과 viewstate 이름을 제어합니다.

+0

아이러니 한 부분은 과거에 UpdatePanels가 약간 느리기 때문에 jQuery를 사용하고 싶었습니다. 이번에는 적은 오버 헤드를 사용하고 강력한 라이브러리로 바로 이동하겠다고 생각했습니다. 맞춰봐! 나는 당신이 제안한대로 할 것입니다, 나는 이미 그것이 어떻게 작동하는지 잘 알고 있습니다. – abx1947

+0

관련 오버 헤드는 알고 있지만 사실 UpdatePanels를 사용하여 실제로 성능이 좋았습니다. 현명한 위치에 놓았습니다. JQuery는 일반적으로 이와 같은 것에 적합 할 것입니다. 그러나 숨겨진 필드 접근법이 엉망이고 앞으로 개발자 코드를 보는 개발자가 적합하기 때문에 여기에서 사용하는 것이 좋습니다. –

관련 문제