/ / Warum erfordert Html.DropDownListFor zusätzliche Besetzung? - c #, asp.net-mvc, enums, html-helper, viewdata

Warum benötigt Html.DropDownListFor zusätzliche Cast? - c #, asp.net-mvc, enums, HTML-Helfer, viewdata

In meinem Controller erstelle ich eine Liste von SelectListItems und speichern Sie dies in der Daten anzeigen. Wenn ich die ViewData in meiner Ansicht lese, wird ein Fehler wegen falscher Typen angezeigt. Wenn ich die Typen manuell umwandle, funktioniert es, aber dies scheint automatisch zu geschehen. Kann jemand das erklären?

Regler:

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;

Aussicht:

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

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

Antworten:

3 für die Antwort № 1

weil ViewData ist ein Dictionary<string, Object>. Wie könnten Sie Objekte verschiedener Typen in einer Sammlung mit Schlüsseln speichern? Alles, was von abgerufen wurde ViewData ohne Casting wird vom Compiler als Basis behandelt Object.


1 für die Antwort № 2

Wenn ich mich recht erinnere, handelt es sich bei ViewData um ein Array / eine Sammlung von Objekten. Deshalb ist die zusätzliche Besetzung erforderlich.


0 für die Antwort № 3

Anscheinend führt der Compiler keinen Cast von einem Objekt des Typs aus Objekt zu einem anderen Typ automatisch. Ich gehe davon aus, dass die Ergebnisse von ViewData zur Kompilierzeit vom Typ Objekt sind. Beispiel folgt:

// 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 für die Antwort № 4

Es ist wegen einer Funktion namens "statisches Tippen". Einige lieben es, andere hassen es.


-1 für die Antwort № 5

Was ist, wenn Sie sich ändern?

ViewData["TitleList"] = titles;

zu

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

und versuche es erneut mit:

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

wenn das klappt, stimme ich mit Femaref überein .... gute frage.