2012-01-19 4 views
4

DropdownListFor 함수를 사용하여 드롭 다운 목록을 만들려고하고 있는데 값을 선택하고 싶습니다.asp.net에서 선택한 값 MVC 4.0 드롭 다운리스트

내가 많이 검색하고 ViewModelSelectList 객체를 갖는 솔루션의 유사한 종류를 발견

, 나는이

같은 유형 SelectList의 속성을 사용 내 ViewModel에서는이

같은 시도

SelectList HoursToSelect = new SelectList(MyDictionaryObject, "Value", "Key", 14/*selected value*/); 

나는이

@Html.DropDownListFor(m => m.EndsOnHour, HoursToSelect) 

이 모든 일하는 벌금처럼 사용하고 있었다 차 내 요구 사항을 완전히

을 충족 그러나 문제는 내가 ViewModel 비 직렬화 CLASSE을 허용하지 않습니다 내 ViewModel로 내 프로젝트에 SelectList 개체를 사용할 수 없습니다 내 프로젝트의 아키텍처 때문이다.

그래서 나를 위해 남아있는 유일한 방법은 여기서 뭔가

@Html.DropDownListFor(m => m.EndsOnHour, new SelectList(Model.Hours, "Value", "Key")) 

그러나 몰라, 단지 내보기에 뭔가를하는 것입니다! 누구나이 목표를 달성 할 생각이 있습니까?

답변

4

개체의 속성에 @Html.DropDownListFor(...)을 사용하면 개체의 현재 상태를 사용하여 선택한 항목을 설정합니다. 따라서 예에서 선택 목록에 값을 지정하지 않으면 m.EndsOnHour 값을 사용하여 선택한 값을 설정합니다. 사실 선택 목록은 실제로 SelectList 일 필요가 없습니다. documentation에서 볼 수 있듯이 실제로는 SelectListItem의 모음이어야합니다.

그러나 직렬화 문제는 여전히 존재합니다. 여기에 몇 가지 옵션이 있습니다. 가장 쉬운 방법은 가능한 경우 뷰 측면에 값을 던지기입니다. 많은 드롭 다운 목록은 예를 들어 주 또는 국가를 나열하는 것과 같은 열거 형의 가능한 선택 항목을 표시하는 정적 선택을 위해 작성되었습니다. 기타 일반적인 예는 날짜 범위 등입니다.이 경우 목록을 생성하고보기에서 호출 한 헬퍼를 작성한 다음보기 모델에서 제거하면됩니다.

그러나 목록이 동적 인 경우 장기적으로 잘 작동하지 않으므로 시스템 유지 관리에 부정적인 영향을 줄 수있는 추가 결합이 발생할 수 있습니다. 이 경우 직렬화 가능한 자신의 SelectList 하위 클래스를 만든 다음이를 IEnumerable<T>의 직렬화 가능 구현의 제네릭 형식 매개 변수로 사용해야합니다. C#의 배열은 직렬화 가능하므로 해당 부분을 처리 할 수 ​​있습니다.

3

개인적으로 나는 DropDownListFor를 포기하고 이렇게했습니다. 훨씬 더 간단합니다. 이것이 좋은 생각이 아니게되는 이유가 있는지 확실하지 않습니다.

<select id="details-title"> 
@foreach (var title in Helper.Titles) 
{ 
<option value="@title.Value" @(title.Value==Model.SelectedTitle?"selected=\"selected\" ":"")>@title.Text</option> 
} 
</select> 
+3

클라이언트 측 유효성 검사를 수동으로 수행해야합니다. 맞춤형 모델 바인더는 이와 관련하여 더 많은 수동 조정이 필요합니다. 정의 된 EditorTemplates에 대한 후크가 없습니다. 그리고 더 많은 코드. 마지막 하나는 정의마다 나쁘지 않지만이 foreach 루프를 드롭 다운 목록이 정의 된 모든보기에 복사하여 붙여 넣는 것입니다. 'DropDownListFor'는 실제로 dropdownlist를 생성하는 훌륭한 방법입니다. 모델의 속성에 바인딩하면 모든 것이 정상입니다.어떤 이유로이 방법이 마음에 들지 않으면 (5 분 이상을 들여다 보면서), 더 좋은 방법은 자신 만의 HTML 도우미를 만드는 것입니다. –