2010-06-11 3 views
2

내 컨트롤러에서 SelectListItems의 목록을 만들고이를 ViewData에 저장합니다. View에서 ViewData를 읽을 때 잘못된 유형에 대한 오류가 발생합니다. 수동으로 유형을 변환하면 작동하지만 자동으로 수행되어야합니다. 누군가 설명 할 수 있습니까?왜 Html.DropDownListFor가 여분의 캐스트가 필요합니까?

컨트롤러 :

enum TitleEnum { Mr, Ms, Mrs, Dr }; 
var titles = new List<SelectListItem>(); 
foreach(var t in Enum.GetValues(typeof(TitleEnum))) 
    titles.Add(new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() }); 

ViewData["TitleList"] = titles; 

보기 : 만약 내가 올바르게 기억

// Doesn't work 
Html.DropDownListFor(x => x.Title, ViewData["TitleList"]) 

// This Works 
Html.DropDownListFor(x => x.Title, (List<SelectListItem>) ViewData["TitleList"]) 
+0

그냥보기 : @ Html.DropDownList ("TitleList")'보기에서 추가 캐스팅없이 작동합니다. – Arvis

답변

3

ViewDataDictionary<string, Object>입니다. 키 컬렉션에 여러 유형의 객체를 저장할 수있는 방법이 있습니까? 형 변환없이 ViewData에서 검색된 내용은 컴파일러에서 Object으로 처리됩니다.

1

,을 ViewData 개체의 배열/모음입니다. 이것이 여분의 캐스트가 필요한 이유입니다. 변경할 경우

ViewData["TitleList"] = titles; 

ViewData["TitleList"] = new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() }; 

다시는 함께 무엇을하려고

-1

이 작동하는지

Html.DropDownListFor(x => x.Title, ViewData["TitleList"]) 

는 내가 Femaref에 동의 할 것입니다 .... 좋은 질문.

0

분명히 컴파일러는 오브젝트 유형의 오브젝트를 다른 유형으로 자동 변환하지 않습니다. ViewData의 결과는 컴파일 할 때 객체 유형을 기대합니다. 예 : 다음과 같습니다.

// This Fails 
object obj = new List<SelectListItem>(); 
Html.DropDownListFor(x => x.Title, obj); 

// This Works 
var obj2 = new List<SelectListItem>(); 
Html.DropDownListFor(x => x.Title, obj2); 
0

"정적 입력"기능 때문입니다. 어떤 사람들은 그것을 사랑하고, 다른 사람들은 그것을 싫어합니다.

관련 문제