我有一个包含enum
的视图模型:
public class PasswordChangerIndexViewModel
{
public enum DatabaseTypes
{
Main = 10,
Florida = 20,
Illinois = 30,
Missouri = 40,
NewHampshire = 50,
NewJersey = 60,
Oklahome = 70
};
[DisplayName("Database")]
public DatabaseTypes DatabaseType { get; set; }
}
在我看来,我使用EnumDropDownListFor
创建了一个下拉列表:
<div class="row">
<div class="col-md-1">
<div class="form-group">
@Html.EnumDropDownListFor(z => z.DatabaseType, "** Select a Database **");
</div>
</div>
</div>
它正在运作,但我想知道是否有办法改变文字。我想要New Hampshire
而不是NewHampshire
和New Jersey
而不是NewJersey
来呈现print
。是否有一种DisplayName attribute或我可以应用于我的视图模型来修复此问题?
答案 0 :(得分:2)
在枚举成员上使用DisplayAttribute
:
public enum DatabaseTypes
{
Main = 10,
Florida = 20,
Illinois = 30,
Missouri = 40,
[Display(Name = "New Hampshire")]
NewHampshire = 50,
[Display(Name = "New Jersey")]
NewJersey = 60,
Oklahome = 70
};
一般情况下,您应该支持使用[Display]
代替[DisplayName]
,因为它支持本地化。
答案 1 :(得分:1)
您可以为Enum DropdownList制作自己的模板。这是我使用的一个使用扩展方法从属性中获取值而不仅仅是枚举的名称:
将其作为EnumDropdown.cshtml
@model Enum
@{
var sort = (bool?)ViewData["sort"] ?? false;
var enumValues = new List<object>();
foreach (var val in Enum.GetValues(Model.GetType()))
{
enumValues.Add(val);
}
}
@Html.DropDownListFor(m => m,
enumValues
.Select(m =>
{
string enumVal = Enum.GetName(Model.GetType(), m);
var display = m.GetDescription() ?? enumVal;
return new SelectListItem()
{
Selected = (Model.ToString() == enumVal),
Text = display,
Value = enumVal
};
})
.OrderBy(x => sort ? x.Text : null)
,new { @class = "form-control" })
以下是GetDescription()
的代码:
public static string GetDescription(this object enumerationValue)
{
Type type = enumerationValue.GetType();
if (!type.IsEnum)
throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
//Tries to find a DescriptionAttribute for a potential friendly name
//for the enum
MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
if (memberInfo != null && memberInfo.Length > 0)
{
object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0)
{
//Pull out the description value
return ((DescriptionAttribute)attrs[0]).Description;
}
}
//If we have no description attribute, just return the ToString of the enum
return enumerationValue.ToString();
}
下面的示例用法。型号:
public enum MyEnum
{
[Description("The First Option1")]
Option1,
Option2
}
public class MyModel
{
[UIHint("EnumDropdown")] //matches EnumDropdown.cshtml
public MyEnum TheEnum { get; set; }
}
查看
@model MyModel
@Html.EditorFor(x => x.TheEnum)
将使用选项“The First Option”和“Option2”
创建一个下拉列表