我正在使用我找到的一个助手 here 来使用通用枚举类型填充我的 SelectLists,不过我做了一些修改以添加选定的值,如下所示:
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 读取为标题而不是枚举名称。 (如果您的枚举包含空格或您需要本地化,那么它会让您的生活更轻松)
因此,您需要像这样将 Display 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 只是一个User_Status 类型的枚举对象。
就是这样,您的 ViewModel 中不再有 SelectList。在我的示例中,我在 ViewModel 中引用枚举,但您可以直接在视图中引用枚举类型。我只是为了让一切变得干净和美好。
希望对您有所帮助。