2010-03-09 7 views
26

asp.net MVC에서 버그가있는 것처럼 보였습니다. 또는 단순히 잘못된 것을하고 있습니다. 현재 1.0을 사용 중이므로 2.0 릴리스에서 해결 될 수 있습니다. 그러나 어느 쪽이든, 여기에 우리가 간다.DropDownList asp.net MVC에서 선택된 항목 설정 MVC

내보기 모델에 드롭 다운 목록의 선언 된 ID와 같은 이름의 속성이있는 경우 선택한 항목이 무시되고 렌더링 된 HTML에는 아무 것도 선택되어 있지 않습니다. 내가 잘못했는지 알 수 없지만 ID의 이름을 변경하면 문제가 해결됩니다. 나는 예제를 단순화했다. 분명히하기를 바란다. 그렇지 않다면 나에게 알려주기 바란다. 선언 된 ID가 내 모델의 목록과 같은 이름입니다 여기에

내이다 :

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <%= Html.DropDownList("IsMultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

그리고 렌더링 된 HTML이

<table border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
     <td> 
      <select id="IsMultipleServicers" name="IsMultipleServicers"> 
       <option value="false">No</option> 
       <option value="true">Yes</option> 
      </select> 
     </td> 
     </tr> 
</table> 

는 이제 할 수 있습니다 작은 변화. 신고 된 ID를 다른 것으로 변경합니다. 이제 렌더링 된 HTML

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
      <%= Html.DropDownList("MultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

: 그리고 지금은 목록에서 두 번째 요소가 될 것입니다 선택한 옵션을 얻을

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <select id="IsMultipleServicers" name="IsMultipleServicers"> 
      <option value="false">No</option> 
      <option selected="selected" value="true">Yes</option> 
     </select> 
     </td> 
    </tr> 
</table> 

공지 사항

여기 내보기입니다. 여기

내 ViewModel을 그냥 모든 것을 함께 묶어하는 것입니다 : 여기

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MVCProject.Models.ViewModels.Service 
{ 
    public class ServiceViewModel : ViewModel 
    { 
     public List<SelectListItem> IsMultipleServicers { get; set; } 
    } 
} 

내 작업입니다 :

[AcceptVerbs(HttpVerbs.Get)] 
public virtual ActionResult Service() 
{ 
    return View(new ServiceViewModel() 
    { 
     IsMultipleServicers = BuildBooleanSelectList(true) 
    }; 
} 

private List<SelectListItem> BuildBooleanSelectList(bool isTrue) 
{ 
    List<SelectListItem> list = new List<SelectListItem>(); 

    if (isTrue) 
    { 
     list.Add(new SelectListItem() { Selected = false, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = true, Text = "Yes", Value = "true" }); 
    } 
    else 
    { 
     list.Add(new SelectListItem() { Selected = true, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = false, Text = "Yes", Value = "true" }); 
    } 
return list; 
    } 

답변

43

나는 문제가 DropDownList 과부하에 대한 혼란 생각 :

  1. Html.DropDownList(string name)name의보기 모델 속성을 찾고 IEnumerable<SelectListItem>을 입력하십시오. 같은 이름의 양식 게시 값이없는 한 목록에서 선택한 항목 (SelectListItem.Selected == true)을 사용합니다.

  2. Html.DropDownList(string name, IEnumerable<SelectListItem> selectList)selectList의 항목을 사용하지만 선택한 값은 사용하지 않습니다. 선택한 모델은 뷰 모델 (또는 데이터 게시)에서 name을 확인하고 SelectListItem.Value과 일치시킴으로써 찾습니다. 값을 찾을 수 없거나 null 인 경우에도 SelectListItems의 목록에서 선택한 값을 사용하지 않습니다.

코드에서 두 번째 오버로드를 사용하지만 존재하지 않는 "value"속성 ("MultipleServicers")을 지정합니다.

은 당신의 문제를 해결, 중 첫 번째 오버로드를 사용하십시오

<%= Html.DropDownList("IsMultipleServicers") %> 

을 또는 뷰 모델에 string MultipleServicers 속성을 추가하고 컨트롤러를 채 웁니다. 당신의 HTML에 대한 다음

public class ServiceViewModel : ViewModel 
{ 
    public string MultipleServicers { get; set; } 
    public List<SelectListItem> IsMultipleServicers { get; set; } 
} 

:

<%= Html.DropDownList(Model.MultipleServicers, Model.IsMultipleServicers) %> 

이 그것을 초기 디스플레이, 후 디스플레이와보기/포스트 모델에 포스트 데이터를 매핑과 주변의 여러 가지 문제를수록 나는이 솔루션을 권 해드립니다 기술은 MVC2에도 매핑됩니다.

<%= Html.DropDownListFor(x => x.MultipleServicers, Model.IsMultipleServicers) %> 
+0

나는 이것이 더 명백했으면 좋겠어.하지만 지금은 이해가된다. 감사합니다 – ppumkin

+0

나는 이것 모두를 추천합니다 : http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-cascading-dropdownlist-in-mvc-4-using-razor/ – Umitk

2

DropDownList 도우미는 모델에서 기본값을 가져옵니다. 첫 번째 경우 이름에 해당하는 모델의 값은 SelectList입니다.이 값은 목록의 항목 중 하나와 일치하지 않으며 목록이므로 값이 선택되지 않습니다. 두 번째 예제에서는 모델에 해당 이름의 속성이 없으므로 모델의 값을 사용할 수 없으며 기본적으로 SelectList 자체에 표시된 상태로 설정됩니다. 일반적으로 모델에서 선택한 값에 대한 속성 (기본값이 됨)과 목록의 잠재적 값을 나타내는 다른 속성을 갖습니다.

+0

무엇에 대한 좋은 설명 사고! 자신의 기본 연습에 정착 한 - 일을 명시 적으로 만드는 가장 좋은 방법 인 것처럼 보이고 SelectListItem 값 생성을 단순화합니다. –

9

같은 문제가 Html.DropDownList (문자열 이름, IEnumerable selectList) 오버로드를 사용하여 발생했습니다. 내 모델의 드롭 다운 목록 이름과 같은 이름의 속성이 나타납니다. MVC는 IEnumerable의 각 항목의 Selected 속성보다 내 Model의 속성 값을 선호했습니다.

해결책은 속성 이름과 일치하지 않는 드롭 다운 목록의 이름을 사용하는 것이 었습니다. 또 다른 해결책은 모델과 뷰 상태를 무시하고 대신 항상 선택된 속성을 존중하는 내 확장 메서드를 작성하는 것입니다.

+1

빠른 수정을 위해이 접근법을 사용해야했지만 이후에 돌아가서 Html.DropDownList를 더 잘 활용하도록 뷰 모델을 리팩터링하는 것이 좋다고 생각합니다. –

관련 문제