2010-06-13 2 views
13

죄송합니다. 이것이 중복이라면 내 검색이 나타나지 않았습니다. (: http://addinit.com/?q=node/54를 여기에서 해제) :ASP.net의 열거 형에서 드롭 다운 목록의 선택된 항목 MVC

나는 열거 유형에 대한 드롭 다운 목록을 생성하기 위해 다음과 같은 방법을 사용하고 그것은 한 가지를 제외하고 잘 작동

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
{ 
    if (!type.IsEnum) 
     throw new ArgumentException("Type is not an enum."); 

    if(selected != null && selected.GetType() != type) 
     throw new ArgumentException("Selected object is not " + type.ToString()); 

    var enums = new List<SelectListItem>(); 
    foreach (int value in Enum.GetValues(type)) 
    { 
     var item = new SelectListItem(); 
     item.Value = value.ToString(); 
     item.Text = Enum.GetName(type, value); 

     if(selected != null) 
      item.Selected = (int)selected == value; 

     enums.Add(item); 
    } 

    return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, enums, "--Select--"); 
} 

. 드롭 다운 목록에 내 모델의 속성과 동일한 이름을 지정하면 선택한 값이 제대로 설정되지 않습니다.

<%= Html.DropDownList("fam", typeof(EnumFamily), Model.Family)%> 

을하지만이되지 않습니다 : 의미이 작품

<%= Html.DropDownList("family", typeof(EnumFamily), Model.Family)%> 

난에 게시하고있는 컨트롤러 메소드에 직접 전체 개체를 전달할 시도하고 있기 때문에, 나는 것 정말 같은 모델의 속성에 지정된 드롭 다운 목록을 갖습니다. "오른쪽"이름을 사용할 때 드롭 다운이 올바르게 게시되지 않고 선택한 값을 설정하지 못하는 것 같습니다.

나는이 문제를 생각하지 않는다 그러나 나는 모노에 MVC 1을 실행하고 2.6

편집 : 난 그냥 창에서이 테스트를하고,이하지 않는 내가 같은 동작

+0

나는 똑같은 행동을 보았고 다른 이름의 드롭 다운 목록을 사용하여 해결했다. – Nate

답변

14

을 가지고 열거/대신의 int 값을 사용하지보십시오 :

item.Value = value.ToString();

사용 :

item.Value = Enum.GetName(type, value);

은 IMO에서 무슨 일이 일어나고있다 int 값 대신 enum 이름을 사용하여 모델에 맞게 드롭 다운의 선택된 값을 자동으로 설정합니다. 뷰 엔진은 게시 된 형식 (이미 게시 된 경우)뿐만 아니라 뷰에 전달되는 모델 + 뷰 데이터에서도 이미 선택된 값을 찾습니다. 검색 결과가없는 경우에만 지정한 선택한 값을 사용합니다.

+0

이것은 단지 표 Freddy 인 것처럼 보인다 - 감사드립니다. 나는 현상금을 더 많이 벌었 으면 좋겠다. 나는 열거 형 값에 의해 구속력을 가질 것이라고 생각했지만, 마침내 무슨 일이 일어나고 있는지 알게되었다. 이제 돌아가서 내가 해킹 한 모든 해킹을 취소해야합니다. 그래야 내가 너에게 화를 낼 것입니다.) – AlexCuse

0

을보고 있어요 꽤 괜찮은 것처럼 보이지만 {nameOfInputParameter}. {propertyName}으로 드롭 다운 목록의 이름을 지정하면 올바르게로드되고 게시됩니다. 그래서, 문제의 형태는 가족을위한 드롭 다운은 다음과 같이 설정 될 수있다 "myModel"라는 형태의 모델과 동일한 유형의 매개 변수를 복용하는 방법에 게시 된 경우 : 이것은 ID로 렌더링

<%= Html.DropDownList("myModel.family", typeof(EnumFamily), Model.Family)%> 

을 myModel_family와 myModel.family의 이름. 나는 이것에 대해 어떻게 느끼는지 모르겠다. 그것은 나에게 조금 떨어져 보인다. 그러나 그것은 지금까지 일하는 것 같습니다. 그것은 새로운 문제를 소개합니다.

<%= Html.TextBox("name") %> 

이 제대로 값을로드되지만 값이 인식되지 않는 매개 변수로 "myModel"를 복용 컨트롤러 메소드에 게시 할 때 : 당신은 더 이상과 같이 ... 등 텍스트 상자를 초기화 할 수 없습니다 제출되는 오브젝트의 일부. 따라서 입력 이름에 매개 변수 이름을 포함해야합니다.

그러나, 다음은 최소한 (이 가고 주위 파고 것은이 질문에 대한 가장 좋은 대답을 개최 만약 내가 궁금하네요) 기본 모델 바인더를 사용하여 값으로 확인하지 않습니다

<%= Html.TextBox("myModel.name") %> 

그래서 당신은이 작업을 수행해야합니다

<%= Html.TextBox("myModel.name", Model.Name) %> 

이 모두 (특히 내가 모델이 null의 상황을 처리 할 수 ​​있어야 페이지에) 꽤 심한 받고있다.바라건대 다른 사람이 더 나은 아이디어 :

4

사실이 해결책입니다. 이 질문에 나와 같은 해결책. 사용 item.Value = Enum.GetName(type, value);
ASP.NET MVC - Html.DropDownList - Value not set via ViewData.Model

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
    { 
     if (!type.IsEnum) 
      throw new ArgumentException("Type is not an enum."); 

     if (selected != null && selected.GetType() != type) 
      throw new ArgumentException("Selected object is not " + type.ToString()); 

     var enums = new List<SelectListItem>(); 
     foreach (int value in Enum.GetValues(type)) 
     { 
      var item = new SelectListItem(); 
      item.Value = value.ToString(); 
      item.Text = Enum.GetName(type, value); 

      if (selected != null) 
       item.Selected = (int)selected == value; 

      enums.Add(item); 
     } 

     // set ViewData first 
     helper.ViewData[name] = enums; 

     // pass in "null" intentionally into the DropDownList extension method 
     return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, null, "--Select--"); 
    } 

는 > 값이 열거 이름으로 렌더링 할 < 옵션 드롭 다운을합니다. 저는 개인적으로 int 값을 포스트 백으로 선호합니다.

희망이 있습니다.

+0

흥미 롭습니다 - ViewData를 사용하지 않을 것 같습니다. 나는이 시점에서 그 길을 내려 가고 싶지는 않지만, 정말로 그 대답에 감사 드린다. 나는 현재의 접근 방식에 문제가 생기면 이것을 시험해 볼 것입니다. – AlexCuse

+0

이것은 대단한 답변이었습니다. 감사합니다! – loraderon

+0

나는 어디에서나 솔루션을 찾고있었습니다. – bman

관련 문제