2010-07-20 13 views
8

"PropertyFeature"라는 클래스가 있습니다. 단순히 "PropertyFeatureID"와 Description이 있습니다. LINQ to SQL을 통해 SQL Server 데이터베이스 테이블에 매핑 된 적절한 모델입니다. 예 인스턴스/행은 다음과 같습니다ASP.NET MVC의 동적 체크 박스 상태 유지

PropertyFeatureID: 2 
Description: "Swimming Pool" 

행 (PropertyFeatures)의 수는 물론 성장하고 축소 할 수 있으며, 그래서 사용자가 그 중 하나를 선택할 수 있도록 동적으로 체크 박스의 목록을 렌더링 할 수 있습니다. 좋은 작품 - 사용자가 직관적으로 체크 박스를 레이블을 클릭하고 전환 할 수 있도록 내가 각 체크 박스의 ID를 지정하고 일치하는 레이블을 렌더링하는

<%foreach (var Feature in (ViewData["Features"] as IEnumerable<MySolution.Models.PropertyFeature>)) { %> 
<%=Html.CheckBox("Features", new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%><label for="Feature<%=Feature.PropertyFeatureID%>"><%=Feature.Description%></label> 
<%}%> 

: 는 동적으로 같은과, 충분히 쉽게 체크 박스를 렌더링 할 수 .

CheckBox의 "이름"을 "기능"으로 설정하면 모든 확인란이 같은 이름으로 렌더링되고 MVC 모델 바인더는 양식이 게시 될 때 "기능"이라는 단일 모음으로 파일을 쌓습니다. 이것은 잘 작동합니다.

일단 양식이 제출되면 확인 된 값을 사용하고 저장하므로 실제 정수 값이 필요하므로 어떤 Boomer 및 필드 이름이 아닌 PropertyFeature를 선택해야합니다. 따라서 이상적으로는 배열이나 컬렉션과 같이 작업하기 쉽습니다.

매개 변수를 int [] 기능으로 지정했기 때문에 단추를 클릭하면 내 컨트롤러 메서드 내에서 선택한 값을 검색 할 수 있습니다.

그러나 문제은 상태를 유지 관리하지 않는다는 것입니다. 즉, 제출 버튼을 클릭하고 페이지가 다시로드 된 상태에서 폼이 다시 표시되면 모든 동적 체크 박스에 체크 된 상태가 유지되기를 원합니다. Html.DropDownListHtml.TextBox으로 만든 다른 모든 필드는 모두 동일한 양식의 같은 페이지에서 전혀 상태를 유지합니다.

비슷한 문제에 대한 다른 스레드와 기사를 모두 읽는 데 많은 시간이 걸렸으며 ICollectionIDictionary을 사용하여 항목을 묶어서 각 항목에 부울 값을 포함하여 확인란을 유지할 수 있다는 이야기가 많이있었습니다. 상태. 그러나 나는 100 % 자신의 개인적인 사례의 맥락에서 그것을 사용하는 방법을 이해하지 못합니다. 솔루션을 정말 간단하게 유지하고 싶습니다. 그리고 체크 박스 상태를 유지하기 위해 새로운 클래스의 페이지를 코딩 할 필요가 없습니다.

이것을 수행하는 가장 깨끗하고 적절한 방법은 무엇입니까?

+0

문제는 게시물 다음에보기를 다시 렌더링 할 때입니다. 바인더는 "Features"라는 입력에 대해 게시 된 값을 찾습니다. 이것은 배열이 될 것이므로 첫 번째 인덱스에서만 작동하는지 궁금합니다. 첫 번째 체크 박스가 상태를 유지할 수 있는지 테스트 할 수 있습니까? 이 경우, 아마도 좀 더 복잡한리스트 바인딩을 조사해야 할 것입니다. – dotjoe

+0

맞습니다. 실제로, 나는 그것이 첫번째 체크 박스조차를 위해조차 전혀 작동하지 않는다는 것을, 생각한다. List 바인딩 접근법으로 좀 더 놀았으며 훨씬 더 유망한 것으로 보인다. 그러나 여전히 조금 복잡한 데다가 아직 최고의 솔루션을 잠글 수 없었습니다. – Aaron

답변

14

나는 다양한 접근 방식으로 많은 놀음을 얻은 후에 작동하게했습니다.뷰

: 수신 제어 방법에있어서

<%string[] PostFeatures = Request.Form.GetValues("Features");%> 
<% foreach (var Feature in (ViewData["AllPropertyFeatures"] as 
          IEnumerable<MySolution.Models.PropertyFeature>)) 
    { %> 
    <input type="checkbox" name="Features" 
     id="Feature<%=Feature.PropertyFeatureID.ToString()%>" 
     value="<%=Feature.PropertyFeatureID%>" 
     <%if(PostFeatures!=null) 
      { 
      if(PostFeatures.Contains(Feature.PropertyFeatureID.ToString())) 
      { 
       Response.Write("checked=\"checked\""); 
      } 
      } 
     %> /> 
    <label for="Feature<%=Feature.PropertyFeatureID%>"> 
      <%=Feature.Description%></label> <% 
    } %> 

:

public ActionResult SearchResults(int[] Features) 

이 방법은 많은 장점이 있습니다

  • 라벨 될 수 있도록 허용을 해당 대화 상대를 토글하려면 클릭하십시오. 딩 체크 박스 (유용성).
  • 컨트롤러 메소드가 선택되지 않은 항목 또는 false/null/blank/0 등을 포함하는 전체 항목이 아닌 선택된 정수 만 포함하는 int의 깔끔한 배열을 수신 할 수 있습니다.
  • 양식이 포함 된 페이지가 다시로드 될 때 확인란의 선택 상태를 유지합니다. 즉 사용자의 선택이 유지됩니다.
  • 기본 ASP.Net MVC Html.CheckBox 도우미에서 생성 된 임의/임의 표기 유형 = 숨겨진 입력 필드가 없습니다. 좋은 이유가 있지만 그럴 필요가 있음을 알고 있지만이 경우에는 필요하지 않습니다. 어떤 ID가 선택되었는지, 그리고 하나의 정돈 된 int []에있는 ID인지를 알아야합니다.
  • 그런 단순한 작업을 수행하는 데 필요한 추가 서버 사이드 비대화 클래스, 헬퍼 및 기타 행복한 혼란이 발생하지 않습니다.

나는 ID가 필요한 역동적 인 체크 박스 목록에 대해 가장 깨끗하고 팽창없는 솔루션을 원하고 비즈니스에 도전하기를 원하는 모든 사람들에게이 방법을 권장합니다!

0

문제는 확인란 목록을 렌더링 할 때 선택한 것으로 설정하지 않는 것입니다. ViewData에서 int[] Features을 설정 한 다음 foreach 루프에서 해당 기능의 ID가 ViewData의 배열에 있는지 확인하십시오. 같은

무엇인가 : 그것은 100 %되지 않을 수도 있습니다

<%=Html.CheckBox("Features", 
    ((int[])ViewData["SelectedFeatures"]).Contains(Feature.PropertyFeatureID), 
    new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })% 

내가 그것을 테스트하지 않았지만.

+0

감사합니다. 죄송합니다. 처음에는 확인란을 선택하지 않아도됩니다. 검색 양식 위에 있습니다. 그들은 항상 공백이어야하며, 사용자는 검색 할 항목을 선택합니다. 그런 다음 페이지를 새로 고침 할 때 선택한 것들을 유지하려고합니다. – Aaron

+0

오른쪽. 처음 페이지가로드되면 SelectedFeatures 배열이 비어있어 확인란을 선택하지 않습니다. 다시 포스트 백하면 SelectedFeatures 배열이 ViewData로 이동하고 뷰가로드 될 때 사용됩니다. –

+0

예. 당신의 도움을위한 건배 데이브. – Aaron