Ich versuche, MVC6-Tag-Helfer zu verwenden, um eine Dropdown-Liste von CountryCode und CountryName zu erstellen, damit ein Benutzer ihr Land nach der Registrierung auswählen kann. Der relevante Teil der Ansicht sieht soweit so aus
%Vor%Der relevante Teil des Viewmodels sieht so aus
%Vor%Ein Land sieht so aus
%Vor%Der Controller gibt eine Liste der Länder an das Viewmodel zurück
%Vor% aber in der Ansicht asp-items="@Model.Countries"
hat eine verzerrte Cannot convert Country to SelectListItem
Ich kann auch nicht finden, wie in dem Formular CountryCode als die zurückzugebende Eigenschaft und CountryName als die anzuzeigende Eigenschaft angeben.
Die Art und Weise, wie ich meine Dropdown-Felder einrichte, ist etwas ähnlich, außer dass in meinem ViewModel meine Eigenschaft vom Typ SelectList
anstelle von IEnumerable<>
ist.
Dann im Controller bekomme ich die Daten und wandle sie in eine anonyme Liste mit zwei Eigenschaften "Id" und "Value" um.
Im Gegenzug erstelle ich in der anonymen Liste ein neues SelectList()
und gebe an, was dataValueField
und was dataTextField
ist.
Schließlich in der Ansicht:
%Vor% Ich habe einen alternativen Weg vorgeschlagen, dies zu tun, indem ich SelectTagHelper
um einige weitere Attribute erweitere, die diese Art der Entwicklung bequemer machen können. Das Problem wird hier besprochen.
Es basiert auf einer Klasse SelectListDescriptor
, die die Liste der Elemente enthält, der Eigenschaft, die das Text- bzw. Wertfeld anzeigt. Dann in der Ansicht ein einfacher Typ
<select asp-descriptor="@ViewBag.CountryDescriptor"><option value="">-- Choose country</option<</select>
.
Der Länderdeskriptor ist nur new SelectListDescriptor(nameof(Country.CountryCode), nameof(Country.CountryName), countries)
. Dies vermeidet magische Strings, indem man die Macht des 'nameof-operator
Tags und Links c# asp.net-core asp.net-core-mvc