MVC - 更改下拉列表中的默认文本
MVC - Changing default text in dropdown
我有一个包含 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
。有没有一种 DisplayName attribute 或者我可以应用到我的视图模型来解决这个问题的东西?
您可以为枚举下拉列表创建自己的模板。这是我使用的一个,它使用扩展方法从属性中获取值,而不仅仅是枚举的名称:
将其作为 EnumDropdown.cshtml
放在 Views/Shared/EditorTemplates 目录中
@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"
的下拉菜单
对您的枚举成员使用 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]
,因为它支持本地化。
我有一个包含 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
。有没有一种 DisplayName attribute 或者我可以应用到我的视图模型来解决这个问题的东西?
您可以为枚举下拉列表创建自己的模板。这是我使用的一个,它使用扩展方法从属性中获取值,而不仅仅是枚举的名称:
将其作为 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"
的下拉菜单对您的枚举成员使用 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]
,因为它支持本地化。