我使用了一個幫手,我發現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