Asp.net-Mvc

如何使用列舉值填充下拉列表?

  • February 24, 2016

我有一個我的視圖模型屬性之一的列舉。我想顯示一個包含列舉所有值的下拉列表。我可以讓它與以下程式碼一起使用。

我想知道是否有一種簡單的方法可以將列舉轉換為 IEnumerable?我可以像下面的例子那樣手動完成,但是當我添加一個新的列舉值時,程式碼會中斷。我想我可以按照這個例子通過反射來做到這一點,但是還有其他方法可以做到這一點嗎?

public enum Currencies
{
 CAD, USD, EUR
}

public ViewModel
{
 [Required]
 public Currencies SelectedCurrency {get; set;}

 public SelectList Currencies
 {
   List<Currencies> c = new List<Currencies>();
   c.Add(Currencies.CAD);
   c.Add(Currencies.USD);
   c.Add(Currencies.EUR);

   return new SelectList(c);
 }
}

我正在使用我在此處找到的幫助器來使用通用列舉類型填充我的 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 中引用列舉,但您可以直接在視圖中引用列舉類型。我只是為了讓一切變得乾淨和美好。

希望這會有所幫助。

引用自:https://stackoverflow.com/questions/3705330