C# 是否将枚举列表转换为SelectList并保持显示?

C# 是否将枚举列表转换为SelectList并保持显示?,c#,razor,html.dropdownlistfor,C#,Razor,Html.dropdownlistfor,我们有一个由选项列表驱动的视图。根据初始条件,将创建一个DropDownList,其中包含用户下一步的选项。此列表由自定义枚举中包含的较大选项列表中的选项填充 我们有这样一个枚举: public enum ChangeMode { [Display(Name ="Please Select")] InitialState, [Display(Name = "Change A Thing")] ChangeThing, //... [Display(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};
}
除了生成的DDL不包括分配给每个模式的用户友好名称,而是显示枚举的开发人员可读值(“InitialState”),所有这些都可以正常工作。如何更改此选项以使视图正确呈现dropdownlist,从而使用显示(名称)作为DDL的文本

ASP.NET Core附带了一个帮助程序,用于为生成SelectListItem 任何枚举

这意味着,如果您有
TEnum
类型的枚举,则可以在 使用
asp items=“Html.GetEnumSelectList()”
查看

更改:

@Html.DropDownListFor(m=>Model.AlterMethod,新选择列表(Model.ValidModes))
致:


或者,如果您只需要
ValidModes
中的值:


您需要从枚举属性中获取值。为此,您需要一个将返回属性的helper方法

以下是访问枚举属性的帮助器方法:

public T GetAttribute<T>(Enum _enum) where T : Attribute
{
    return 
        (T)_enum.GetType()
                .GetField(Enum.GetName(_enum.GetType(), _enum))
                .GetCustomAttribute(typeof(T));
}
public T GetAttribute(Enum\u Enum)其中T:Attribute
{
返回
(T) _enum.GetType()
.GetField(Enum.GetName(_Enum.GetType(),_Enum))
.GetCustomAttribute(typeof(T));
}
用法:

var name = GetAttribute<DisplayAttribute>(ChangeMode.InitialState).Name;
var name=GetAttribute(ChangeMode.InitialState).name;

使用反射获取枚举属性。@iSR5-老实说,我从来没有真正使用过反射。我知道(在高层次上)它是什么,它有什么力量,但不知道如何开始这样做。你能给出一个更详细的答案吗?你能展示构建模型的代码吗?@Dennis1679:当然,补充道。不过,这并不是什么不寻常或不寻常的事情。谢谢。这实际上有点不寻常,因为它表明您在这里基本上要做的是实例化一个枚举类。我会写一个答案来解决你想做的事情,并为你提供一个不错的下拉列表。有希望地。请稍等。这不会用枚举的所有可能值填充SelectList吗?因为这和我想做的恰恰相反。我明确地只希望用户可以选择的有效模式在列表中。ValidModes是什么类型?ValidModes是由控制器填充的列表。但列表不只是变更模式枚举的列表,并且仍然保留所有可能的枚举值吗?否,因为我在控制器中只使用特定的值来构建和填充它。这是我最终选择的方法。我编辑了我的控制器和模型以创建SelectItems列表,而不是枚举列表,并如上所示构建SelectItems。
var name = GetAttribute<DisplayAttribute>(ChangeMode.InitialState).Name;