2010-06-11 14 views
2

Dans mon contrôleur, je crée une liste de SelectListItems et de le stocker dans le ViewData. Lorsque je lis ViewData dans ma vue, il me donne une erreur sur les types incorrects. Si je lance manuellement les types, cela fonctionne, mais il semble que cela devrait se faire automatiquement. Quelqu'un peut-il expliquer?Pourquoi Html.DropDownListFor nécessite un cast supplémentaire?

Controller:

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; 

Voir:

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

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

utilisez simplement: '@ Html.DropDownList (" TitleList ")' dans la vue, cela fonctionnera sans coulée supplémentaire – Arvis

Répondre

3

Parce que ViewData est un Dictionary<string, Object>. Sinon, comment pourriez-vous stocker des objets de types multiples dans une collection à clés? Tout ce qui est extrait de ViewData sans conversion sera traité par le compilateur comme base Object.

1

Si je me souviens bien, ViewData est un tableau/collection d'objets. C'est pourquoi la distribution supplémentaire est nécessaire.

-1

si vous changez

ViewData["TitleList"] = titles; 

à

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

et essayez à nouveau avec:

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

si cela fonctionne, la je serais d'accord avec Femaref .... Bonne question cependant.

0

Apparemment, le compilateur n'effectuera pas de conversion à partir d'un objet de type objet vers un autre type automatiquement. Je m'attends à ce que les résultats de ViewData soient de type objet à la compilation. Exemple:

// 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

C'est à cause d'une fonctionnalité appelée "typage statique". Certains l'aiment, d'autres le détestent.