2010-07-28 2 views
5

ASP.NET MVC 뷰에서 드롭 다운 목록을 채울 수 있습니다.ASP.NET MVC : DropDownListFor가 옵션을 선택하지 않습니다.

<%= Html.DropDownListFor(model => model.Bikes, 
     Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
      })) %> 

나는 그것이해야 할 때 Selected 속성이 true로 설정되어 있는지 볼이 디버깅 할 수 있습니다. 그러나보기가 렌더링 될 때 목록의 옵션이 선택되지 않습니다. DropDownListFor의 또 다른 오버로드로이 작업을 수행 할 수 있다는 것을 알고 있지만 실제로이 버전을 사용하고 싶습니다.

아이디어가 있으십니까?

답변

5

선택한 값이 작동하지 않는 이유는 URL을 옵션 값으로 사용하지만 Selected 절에 Model.ID을 지정했기 때문입니다.

는 다음과 같이하십시오 : "Name" 옵션의 레이블로 사용되는 속성을 나타내는 반면

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes, "Id", "Name", Model.ID) 
)%> 

"Id" 옵션 값으로 사용되는 속성을 나타냅니다.

보존하려는 경우 Url.Action 당신이 시도 할 수 : 당신은 그것을 옵션 값으로 모델 ID를 사용하는 것이 더 논리적 인 듯 나는이 이름과 ID를 반전 한 것을 알 수

<%= Html.DropDownListFor(
    model => model.Bikes, 
    new SelectList(Model.Bikes.Select(x => new { 
     Id = x.Id, 
     Name = Url.Action("Details", "Bike", new { bikeId = x.ID }) 
    }), "Id", "Name", Model.ID) 
)%> 

.


UPDATE :

당신이 IEnumerable합니다 (DropDownListFor 도우미의 첫 번째 인수)에 결합되어 있기 때문에이 작동하지 않는 이유는. 같은 model.Bikes 컬렉션을 사용하는 동안은 스칼라 속성을해야한다 : 옵션 값이 진정한 의미로 URL을 사용하지 않는 약

<%= Html.DropDownListFor(
    model => model.SelectedBikeValue, 
    Model.Bikes.Select(
     x => new SelectListItem { 
       Text = x.Name, 
       Value = Url.Action("Details", "Bike", new { bikeId = x.ID }), 
       Selected = x.ID == Model.ID, 
     } 
)) %> 

내 말.

+0

원래 질문에서 값은 URL입니다. –

+1

예, 나는 이것을 알아 챘습니다. 그러나 이것은 나에게 나쁜 생각이었습니다. 그건 그렇고 그게 당신이 선택한 가치가 작동하지 않는 이유입니다. Model.Id를 선택한 값으로 전달하고 urls를 옵션 값으로 사용합니다. 좋지 않다.ID 값을 옵션 값으로 유지하고 필요할 경우 제출할 컨트롤러 작업에서 해당 URL을 가져 오는 것이 좋습니다. 옵션 값으로 URL을 사용하는 것이 합리적이지 않습니다. –

+0

내 원래 코드에서 ID 값을 선택 값 및 URL을 옵션 값으로 전달하지 않습니다. 내가하고있는 일은 값을 URL로 설정 한 다음 항목을 선택해야하는 조건을 사용하는 것입니다. 왜 URL에 값을 사용해서는 안되는 이유는 무엇입니까? –

0

나는이 개념에 많은 문제가있었습니다. 객체 이름이 자동으로 이름 앞에 추가되기 때문에 객체의 해당 속성이 포함 된 모델의 "name" 속성을 객체에 전달할 수없는 경우 특히 그 자체가 나타납니다. 이건 미친 짓이야. 이 시간을 계산하기 위해 많은 시간을 낭비한 후 방금 포기하고 여기에 게시 한 내 자신의 드롭 다운 확장 프로그램을 작성했습니다. 그것은 매우 간단하며 잘 작동합니다. 당신은 속성의 표준 익명의 목록을 통해 결합 할 경우, 그것은 꽤 번거 로움이 될 수 있기 때문에

public static MvcHtmlString SimpleDropDown(this HtmlHelper helper, object attributes, IEnumerable<SelectListItem> items, bool disabled = false) 
    { 
     XElement e = new XElement("select", 
      items.Select(a => { 
       XElement option = new XElement("option", a.Text); 
       option.SetAttributeValue("value", a.Value); 
       if (a.Selected) 
        option.SetAttributeValue("selected", "selected"); 
       return option; 
      }) 
      ); 

     if (attributes != null) 
     { 
      Dictionary<string, string> values = (from x in attributes.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(attributes, null) == null ? "" : x.GetGetMethod().Invoke(attributes, null).ToString())); 
      foreach(var v in values) 
       e.SetAttributeValue(v.Key, v.Value); 
     } 

     if (disabled) 
      e.SetAttributeValue("disabled", ""); 

     return new MvcHtmlString(e.ToString()); 
    } 

또한, 나는, 여분의 매개 변수로 플래그 장애인을 넣어.

다음은 현재 사용 방법의 예입니다. 사전을 SelectListItem의 목록으로 변환하지만 단순한 목록 일 수도 있습니다.

@Html.SimpleDropDown(new { id="EOM", name = "EOM", @class = "topBox" }, Model.EOM.Select(x => new SelectListItem { Text = x.Value, Value = x.Key.ToString(), Selected = Model.EOM.Selected == x.Key }), !Model.EOM.Available) 
관련 문제