将枚举列表转换为 SelectList 并保持显示?
Convert List of Enums to a SelectList and maintain display?
我们有一个由选项列表驱动的视图。根据初始条件,创建一个 DropDownList,其中包含用户下一步的选择。此列表由包含在自定义枚举中的更大选项列表中的选项填充。
所以我们有一个像这样的枚举:
public enum ChangeMode
{
[Display(Name ="Please Select")] InitialState,
[Display(Name = "Change A Thing")] ChangeThing,
//...
[Display(Name = "Do a Dance")] DoADance,
FinishedSuccess,
FinishedFailure
}
在视图的控制器中,我们构建了一个列表,其中包含用户的所有有效选项,这绝不是完整列表。
if( /*Irrelevant determining characteristic*/ )
{//Valid choices for this option
model.ValidModes = new List<ChangeMode> { ChangeMode.InitialState, ChangeMode.ChangeThing};
}
然后我们根据模型的 ChangeModes 列表在视图中创建一个 DropDownList
@Html.DropDownListFor(m => Model.AlterMethod, new SelectList(Model.ValidModes))
除了生成的 DDL 不包含分配给每个模式的用户友好名称,而是显示枚举的开发人员可读值(例如 'InitialState')之外,所有这些都工作得很好.我如何更改它以使视图正确呈现下拉列表,以便它使用显示(名称)作为 DDL 的文本?
ASP.NET Core ships with a helper for generating a SelectListItem for
any enum.
这意味着如果你有一个 TEnum
类型的枚举,你可以在你的
使用 asp-items="Html.GetEnumSelectList<TEnum>()"
.
查看
变化:
@Html.DropDownListFor(m => Model.AlterMethod, new SelectList(Model.ValidModes))
收件人:
<select asp-for="AlterMethod" asp-items="Html.GetEnumSelectList<Enums.ChangeMode>()"></select>
或者如果您只想要来自 ValidModes
的值:
<select asp-for="AlterMethod" asp-items="Html.GetEnumSelectList(typeof(Model.ValidModes))"></select>
您需要从枚举属性中获取值。为此,您需要一个辅助方法来 return 属性。
这是访问枚举属性的辅助方法:
public T GetAttribute<T>(Enum _enum) where T : Attribute
{
return
(T)_enum.GetType()
.GetField(Enum.GetName(_enum.GetType(), _enum))
.GetCustomAttribute(typeof(T));
}
用法:
var name = GetAttribute<DisplayAttribute>(ChangeMode.InitialState).Name;
我们有一个由选项列表驱动的视图。根据初始条件,创建一个 DropDownList,其中包含用户下一步的选择。此列表由包含在自定义枚举中的更大选项列表中的选项填充。
所以我们有一个像这样的枚举:
public enum ChangeMode
{
[Display(Name ="Please Select")] InitialState,
[Display(Name = "Change A Thing")] ChangeThing,
//...
[Display(Name = "Do a Dance")] DoADance,
FinishedSuccess,
FinishedFailure
}
在视图的控制器中,我们构建了一个列表,其中包含用户的所有有效选项,这绝不是完整列表。
if( /*Irrelevant determining characteristic*/ )
{//Valid choices for this option
model.ValidModes = new List<ChangeMode> { ChangeMode.InitialState, ChangeMode.ChangeThing};
}
然后我们根据模型的 ChangeModes 列表在视图中创建一个 DropDownList
@Html.DropDownListFor(m => Model.AlterMethod, new SelectList(Model.ValidModes))
除了生成的 DDL 不包含分配给每个模式的用户友好名称,而是显示枚举的开发人员可读值(例如 'InitialState')之外,所有这些都工作得很好.我如何更改它以使视图正确呈现下拉列表,以便它使用显示(名称)作为 DDL 的文本?
ASP.NET Core ships with a helper for generating a SelectListItem for any enum.
这意味着如果你有一个 TEnum
类型的枚举,你可以在你的
使用 asp-items="Html.GetEnumSelectList<TEnum>()"
.
变化:
@Html.DropDownListFor(m => Model.AlterMethod, new SelectList(Model.ValidModes))
收件人:
<select asp-for="AlterMethod" asp-items="Html.GetEnumSelectList<Enums.ChangeMode>()"></select>
或者如果您只想要来自 ValidModes
的值:
<select asp-for="AlterMethod" asp-items="Html.GetEnumSelectList(typeof(Model.ValidModes))"></select>
您需要从枚举属性中获取值。为此,您需要一个辅助方法来 return 属性。
这是访问枚举属性的辅助方法:
public T GetAttribute<T>(Enum _enum) where T : Attribute
{
return
(T)_enum.GetType()
.GetField(Enum.GetName(_enum.GetType(), _enum))
.GetCustomAttribute(typeof(T));
}
用法:
var name = GetAttribute<DisplayAttribute>(ChangeMode.InitialState).Name;