我使用了一个帮手,我发现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作为标题,而不是枚举名。 (如果你的枚举包含空格或者你需要本地化,然后它会让你的生活变得更轻松)
所以,你需要将显示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
类型的枚举对象。
就是这样,ViewModels中没有更多的SelectLists。在我的示例中,我正在折叠ViewModel中的枚举,但您可以直接在您的视图中引用枚举类型。我只是为了让一切变得干净而美好。
希望有帮助。
伟大的解决方案! – 2012-01-30 00:28:34
确实很棒。但是,如果enum中的条目没有description属性,则失败。所以用'.FirstOrDefault()'替换'.First()'而不是'items.Add(value,attrs.GetName());''有'items.Add(value,attrs!= null?attrs.GetName ):value.ToString());''''''''''''''''''''''''''' – trailmax 2012-08-13 13:30:19
完成,感谢您的更正。 – 2014-07-04 12:42:10