2010-12-03 3 views
0

ASP.NET MVC 2를 사용하여 간단한 비즈니스 응용 프로그램을 작성하고 있습니다. 여기에 세부 사항 중 일부입니다 : 작업 지시와ASP.NET MVC에서 컨트롤 상태를 잃지 않도록하는 방법

  • 응용 상품과 은 작업 순서 인덱스 뷰를 가지고있다. 보기에는 작업 주문을 나열하는 테이블과 몇 가지 컨트롤 (텍스트 상자, 확인란 및 목록 드롭 다운)이 표시되어 작업 지시가 표시되는 에 대한 기준을 선택합니다.

  • 저는 viewmodels를 사용하고 있습니다. 작업 순서 색인보기에는 각 제어마다 속성이있는보기 모델이 있습니다.

  • 내가 에 대한 답변이 질문 수행되고 있는지 과 유사한 페이징 구현했습니다

    : How do I do pagination in ASP.NET MVC? 내가 LINQ의 건너 뛰기 (사용하고 있습니다)을 시연 로) (가지고, 그리고 탐색을위한 ActionLinks . 내가 페이지를로드 가 컨트롤 중 하나를 조작하지 않으면

  • , 나는 페이지 수에 클릭 을 ActionLinks 및 작업 지시의 잘 사이의 페이지를 이동할 수 있습니다. 그러나 내가 을 변경하면 다른 페이지로 이동할 때 내 변경 사항이 없어져 입니다.

    예를 들어, 내가 페이지 1 에있어 경우에 체크되지 않은 체크 박스를 클릭 한 은 결과의 두 번째 페이지가 로드 2 페이지, 에 대한 링크를 클릭하지만 확인란으로 되돌아갑니다 그 이전 상태입니다.

나는 왜 이런 일이 일어나는 지 이해하지만 디자인의 관점에서 무엇을 할 수 있는지 궁금합니다. 내가 생각할 수있는

잠재적 인 솔루션 :

  1. 은 ActionLinks에 경로로 값을 모두 제어 값을 설정합니다. 이 은 매우 불쾌한 것처럼 보이며 매우 긴 URL이나 쿼리 문자열에서 이 될 수 있습니다. 사실, 이제는 컨트롤 값을 캡처하는 방법이 없다면 작동하지 않을 것이라고 생각했습니다.

  2. ActionLinks가 을 게시하지 않으므로 버튼으로 교체하십시오. 다시 말하지만, 이것은 나쁜 생각처럼 보입니다.

  3. 이 POST 인 jQuery 스크립트를 실행하는 링크로 ActionLink를 변경하십시오. 나는 이것이 지금까지 가장 유익한 옵션 인 이라고 생각한다. 많은 개발자가 이렇게합니까?

이것은 일반적인 문제처럼 보입니다.하지만이 옵션 중 어느 것도 괜찮은 것 같지 않습니다. 내가 뭔가를 놓치고 있는지 궁금해.사용자가 (jQuery를 사용) 확인란을 전환 할 때

답변

0

을, 나는, 페이징에 대한 ActionLinks 치우는 감아 일반 앵커 태그로 대체했습니다. 현재 페이지 인덱스는 이제 숨겨진 양식 값에 저장됩니다

$(document).ready(function() { 

    $('.pageLink:[href]').click(function() { 
     $('#page').val($(this).text()); // Set hidden field value to the text of the page link, which is the page number. 
     $('form:first').submit(); 
    }); 

}); 
:

다음
<input id="page" name="page" type="hidden" value="" /> 

<p> 
    <% for (var i = 1; i <= (int)Math.Ceiling(Model.RowsMatchingCriteria/(double)Model.PageSize); i++) { %> 

     <%-- 
      If the page number link being rendered is the current page, don't add the href attribute. 
      That makes the link non-clickable. 
     --%> 
     <a class="pageLink" <%= i != Model.Page ? @"href=""javascript:void(0);""" : string.Empty %>><%: i %></a> 

    <% } %> 
</p> 

내가 링크를 클릭 할 때 양식을 숨겨진 페이지 값을 설정하고 제출하는 다음의 jQuery 스크립트를 추가

문제가 해결되었습니다.

0

방금 ​​데이터베이스에 다시 변경 내용을 저장할 수 없습니다 : 결국

$("input[type=checkbox]").click(function() { 
    $.ajax({ 
      type: "POST", 
      url: "/ControllerName/SaveInfo?id=" + {id}, 
      success: function(){ 
       alert("Data Saved: " + msg); 
      } 
    }); 
}); 
+0

아니요, 내 컨트롤의 상태를 데이터베이스에 저장하고 싶지 않습니다. 그것은 비효율적 일 것입니다. 그러나 나는 결국 jQuery를 사용했다. –

0

가장 좋은 방법은 사용자가 페이지 매김 할 때 변경 내용을 숨겨진 필드에 "로깅"함으로써 효과적으로 viewstate를 시뮬레이트하는 것입니다. 이를 수행하려면 :

1) 캡쳐 할 데이터와 데이터 형식을 알아 내십시오. 즉, json 객체의 배열 2) 화재 전/다음을 처리하는 링크를 설정하십시오 "변경된"것들을 모으고 그것들을 객체들과 숨겨진 필드에 채우는 방법을 없애라.
3) 양식을 게시 할 때 숨겨진 필드를 구문 분석하고 데이터를 추출하고 이익을 얻습니다.

+0

위의 답변을 참조하십시오. 내가 한 일은 ASP.NET MVC의 "컨벤션 오버 규칙 (convention over configuration)"으로 인해 대부분 자동 실행을 제외하고는 다소 비슷합니다. 숨겨진 필드 (및 컨트롤의 다른 모든 필드)에는 뷰 모델에 해당 속성이 있습니다. 따라서 제출을하면 자동으로 연결됩니다. –

+0

예, 다소 비슷하지만 여전히 GET 요청을 효과적으로 게시하고 있습니다. 이는 일종의 자책입니다. –

+0

GET 요청을 게시하면 무슨 뜻인지 알 수 없습니다. 분명히 게시물을 작성하고 있습니다. 액션 메소드는 HttpPost 속성으로 장식되어 있습니다. 내가 이해하는 한 GET은 관련이 없다. –