2010-06-11 108 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 2013-09-30 23:23:39

回答

3

因爲ViewDataDictionary<string, Object>。您還可以如何將多種類型的對象存儲在鍵控集合中?從ViewData中檢索到的任何內容都將被編譯器視爲基地Object

1

如果我沒有記錯,ViewData的是對象的數組/集合。這就是爲什麼需要額外的演員。

-1

,如果你改變

ViewData["TitleList"] = titles; 

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

,並再次嘗試:

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

這是因爲一個稱爲「靜態類型」的功能。有些人喜歡它,有些人則討厭它。

相關問題