Saya tahu saya terlambat ke pesta tentang hal ini, tetapi saya pikir Anda mungkin menemukan varian ini berguna, karena yang ini juga memungkinkan Anda untuk menggunakan string deskriptif daripada konstanta enumerasi dalam drop down. Untuk melakukan ini, hiasi setiap entri enumerasi dengan atribut [System.ComponentModel.Description].
Sebagai contoh:
public enum TestEnum
{
[Description("Full test")]
FullTest,
[Description("Incomplete or partial test")]
PartialTest,
[Description("No test performed")]
None
}
Ini kode saya:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Reflection;
using System.ComponentModel;
using System.Linq.Expressions;
...
private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
{
Type realModelType = modelMetadata.ModelType;
Type underlyingType = Nullable.GetUnderlyingType(realModelType);
if (underlyingType != null)
{
realModelType = underlyingType;
}
return realModelType;
}
private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };
public static string GetEnumDescription<TEnum>(TEnum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if ((attributes != null) && (attributes.Length > 0))
return attributes[0].Description;
else
return value.ToString();
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
{
return EnumDropDownListFor(htmlHelper, expression, null);
}
public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Type enumType = GetNonNullableModelType(metadata);
IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();
IEnumerable<SelectListItem> items = from value in values
select new SelectListItem
{
Text = GetEnumDescription(value),
Value = value.ToString(),
Selected = value.Equals(metadata.Model)
};
// If the enum is nullable, add an 'empty' item to the collection
if (metadata.IsNullableValueType)
items = SingleEmptyItem.Concat(items);
return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
}
Anda kemudian dapat melakukan ini dalam pandangan Anda:
@Html.EnumDropDownListFor(model => model.MyEnumProperty)
Semoga ini bisa membantu Anda!
** EDIT 2014-JAN-23: Microsoft baru saja merilis MVC 5.1, yang sekarang memiliki fitur EnumDropDownListFor. Sayangnya itu tampaknya tidak menghormati atribut [Deskripsi] sehingga kode di atas masih berdiri. Lihat bagian Enum di catatan rilis Microsoft untuk MVC 5.1.
Pembaruan: Itu memang mendukung atribut Display[Display(Name = "Sample")]
, jadi orang dapat menggunakannya.
[Perbarui - perhatikan saja ini, dan kode ini terlihat seperti versi kode yang diperluas di sini: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , dengan beberapa tambahan. Jika demikian, atribusi akan tampak adil ;-)]