Ein ähnlicher Ansatz, der auf Simons Antwort aufbaut, besteht darin, die anzuzeigenden Enum-Werte aus einer Ressourcendatei zu beziehen, anstatt sie in einem Beschreibungsattribut innerhalb des Enums selbst zu speichern. Dies ist hilfreich, wenn Ihre Website in mehr als einer Sprache gerendert werden muss, und wenn Sie eine spezielle Ressourcendatei für Enums haben, könnten Sie einen Schritt weiter gehen und nur Enum-Werte in Ihrem Enum haben und sie von der Erweiterung durch eine Konvention wie [EnumName]_[EnumValue] referenzieren - letztendlich weniger Tipparbeit!
Die Erweiterung sieht dann so aus:
public static IHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> html, Expression<Func<TModel, TEnum>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var enumType = Nullable.GetUnderlyingType(metadata.ModelType) ?? metadata.ModelType;
var enumValues = Enum.GetValues(enumType).Cast<object>();
var items = from enumValue in enumValues
select new SelectListItem
{
Text = GetResourceValueForEnumValue(enumValue),
Value = ((int)enumValue).ToString(),
Selected = enumValue.Equals(metadata.Model)
};
return html.DropDownListFor(expression, items, string.Empty, null);
}
private static string GetResourceValueForEnumValue<TEnum>(TEnum enumValue)
{
var key = string.Format("{0}_{1}", enumValue.GetType().Name, enumValue);
return Enums.ResourceManager.GetString(key) ?? enumValue.ToString();
}
Ressourcen in der Datei Enums.Resx sehen wie folgt aus ItemTypes_Movie : Film
Eine andere Sache, die ich gerne tue, ist, anstatt die Erweiterungsmethode direkt aufzurufen, rufe ich sie lieber mit einem @Html.EditorFor(x => x.MyProperty) auf, oder idealerweise habe ich einfach das ganze Formular in einem einzigen @Html.EditorForModel(). Um dies zu tun, ändere ich die String-Vorlage wie folgt
@using MVCProject.Extensions
@{
var type = Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType) ?? ViewData.ModelMetadata.ModelType;
@(typeof (Enum).IsAssignableFrom(type) ? Html.EnumDropDownListFor(x => x) : Html.TextBoxFor(x => x))
}
Wenn Sie sich dafür interessieren, habe ich hier in meinem Blog eine viel ausführlichere Antwort veröffentlicht:
http://paulthecyclist.com/2013/05/24/enum-dropdown/