Я использую помощника, который нашел здесь , чтобы заполнить мои списки выбора универсальным типом перечисления, хотя я сделал небольшую модификацию, чтобы добавить выбранное значение, вот как это выглядит:
public static SelectList ToSelectList<T>(this T enumeration, string selected)
{
var source = Enum.GetValues(typeof(T));
var items = new Dictionary<object, string>();
var displayAttributeType = typeof(DisplayAttribute);
foreach (var value in source)
{
FieldInfo field = value.GetType().GetField(value.ToString());
DisplayAttribute attrs = (DisplayAttribute)field.
GetCustomAttributes(displayAttributeType, false).FirstOrDefault()
items.Add(value, attrs != null ? attrs.GetName() : value.ToString());
}
return new SelectList(items, "Key", "Value", selected);
}
Приятно то, что он читает атрибут DisplayAttribute в качестве заголовка, а не имя перечисления. (если в ваших перечислениях есть пробелы или вам нужна локализация, это делает вашу жизнь намного проще)
Таким образом, вам нужно будет добавить отображение attirubete к вашим перечислениям следующим образом:
public enum User_Status
{
[Display(Name = "Waiting Activation")]
Pending, // User Account Is Pending. Can Login / Can't participate
[Display(Name = "Activated" )]
Active, // User Account Is Active. Can Logon
[Display(Name = "Disabled" )]
Disabled, // User Account Is Diabled. Can't Login
}
и вот как вы используете их в своих представлениях.
<%: Html.DropDownList("ChangeStatus" , ListExtensions.ToSelectList(Model.statusType, user.Status))%>
Model.statusType
- это просто объект enum типа User_Status
.
Вот и все, больше нет списков выбора в ваших моделях представления. В моем примере я ссылаюсь на enum в моей ViewModel, но вы можете сделать ссылку на тип enum прямо в вашем представлении. Я просто делаю это, чтобы все было чисто и красиво.
Надеюсь, это было полезно.