2017-04-11 1 views
0

요즘 일상적인 상황에서 사용자가 ASP.NET MVC 응용 프로그램에서 Enum 값을 선택하도록 허용해야합니다. MVC 버전 5.2를 사용하고 있기 때문에이 작업을 수행 할 수 있습니다.EnumDropDownList 값을보기에 전달하지 않고 값을 선택하지 않습니다.

// Model 
public MyEnum EnumVal { get; set; } 

// Controller 
return View(new MyModel{EnumVal = MyEnum.SomeVal}); 

// View 
@Html.EnumDropDownListFor(model => model.EnumVal) 

그리고 모두 마술처럼 작동합니다. 나는 그것을 당연한 것으로 여기기에 충분한 시간을 보냈습니다.

그러나 나는 방금 전달한 값이 드롭 다운의 현재 값으로 선택되지 않고 있음을 발견했습니다.

모델의 내용을 출력하여 값이 올바르게 전달되는지 확인할 수 있지만 드롭 다운의 경우 첫 번째 값만 선택됩니다.

기타 답변 (예 : herehere)은 제가 알고 있다고 생각한 것을 확인하는 것 같습니다. 제가 통과 한 값을 선택하기 위해 드롭 다운을 얻으려고 다른 것을 할 필요가 없어야합니다.

나는 두뇌 방귀가 있습니까? 왜 이것이 효과가 없습니까?


업데이트

다음 컨트롤러 방법보다 전체 목록입니다 :

public ActionResult Create(string enumVal) 
{ 
    var valueToPass = AccountsDestination.QbDUk; 
    Enum.TryParse(enumVal, out valueToPass); 
    return View(new QuickBooksMappingViewModel(){EnumVal = valueToPass}); 
} 
+0

표시된 코드가 정상적으로 작동합니다. 문제를 일으킬 수있는 자바 스크립트가 있습니까? 그리고 컨트롤러 메소드가 GET이고 POST에서 값을 변경하려고하지 않거나 GET 메소드에서'enum '에 대한 매개 변수가 없다고 가정합니다. –

+0

@StephenMuecke 당신이 그것을 찍었 어! get params 중 하나의 이름과 충돌했습니다. 매개 변수의 이름을 변경하는 것은 모두 완료되었습니다. (답장으로 답을 자유롭게 바꾸면 받아 들일 것입니다.) –

+0

관련 코드 - 메서드의 서명을 표시하지 않았습니다. –

답변

3

문제는 당신의 방법은 모델과 동일한 이름을 가진 매개 변수 enumVal을 (가지고 있다는 것입니다은 재산). 메서드가 실행될 때 DefaultModelBinder은 매개 변수의 값을 ModelState에 추가합니다. 뷰에서

이 찾아 ModelState의 값으로 선택 옵션을 설정하려고 ModelState에서 일치 (다음 ViewData 마지막 모델 값)에 대한 EnumDropDownListFor() 방법을 먼저 확인합니다. 이것이 기본 동작 인 이유에 대한 설명은 TextBoxFor displaying initial value, not the value updated from code을 참조하십시오.

귀하의 경우, 매개 변수의 값은 첫 번째 옵션의 값이거나 모든 옵션 값과 일치하지 않습니다 (어떤 것이 있어야하기 때문에 첫 번째 옵션이 선택됩니다).

모델 이름 중 하나와 같지 않은 매개 변수의 이름을 변경하거나 ModelState.Clear();을 사용하여 ModelState에서 값을 제거 할 수 있습니다.

관련 문제