yam*_*pog 8 generics asp.net-mvc ienumerable enums
我有一个枚举我的视图模型的属性之一.我想显示一个下拉列表,其中包含枚举的所有值.我可以使用以下代码使用它.
我想知道是否有一种简单的方法从枚举转换为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);
}
}
Run Code Online (Sandbox Code Playgroud)
Man*_*ous 18
我正在使用一个帮助器,我在这里用一个通用的枚举类型填充我的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);
}
Run Code Online (Sandbox Code Playgroud)
关于它的好处是它将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
}
Run Code Online (Sandbox Code Playgroud)
这就是你在视图中使用它们的方式.
<%: Html.DropDownList("ChangeStatus" , ListExtensions.ToSelectList(Model.statusType, user.Status))%>
Run Code Online (Sandbox Code Playgroud)
Model.statusType
只是类型的枚举对象User_Status
.
就是这样,ViewModel中不再有SelectLists.在我的示例中,我正在我的ViewModel中重新生成枚举,但您可以直接在视图中参考枚举类型.我只是这样做,让一切都干净整洁.
希望这很有帮助.
归档时间: |
|
查看次数: |
15351 次 |
最近记录: |