c# - 从 GetEnumSelectList<> 获取文本值而不是索引值

标签 c# asp.net-mvc asp.net-core

GetEnumSelectList<> 返回索引值而不是文本值。如何获取文本值?

Usage: 
<select asp-for="Policy" asp-items="Html.GetEnumSelectList(typeof(PolicyEnum))" class="form-control"></select>

Results:
<select class="form-control" id="Policy" name="Policy">
  <option value="0">SuperAdmin</option>
  <option value="1">Admin</option>
  <option value="2">User</option>
  <option value="3">ClientAdmin</option>
  <option value="4">ClientUser</option>
</select>

Desired Results:
<select class="form-control" id="Policy" name="Policy">
  <option value="SuperAdmin">SuperAdmin</option>
  <option value="Admin">Admin</option>
  <option value="User">User</option>
  <option value="ClientAdmin">ClientAdmin</option>
  <option value="ClientUser">ClientUser</option>
</select>

最佳答案

如果您只需要SuperAdmin,您可以定义以下扩展:

public static class ExtensionMethods
{
    public static IEnumerable<SelectListItem> GetEnumValueSelectList<TEnum>(this IHtmlHelper htmlHelper) where TEnum : struct
    {
        return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>()
            .Select(x =>
                new SelectListItem
                {
                    Text = x.ToString(),
                    Value = x.ToString()
                }), "Value", "Text");
    }       
}

和用法:

<select asp-items="Html.GetEnumValueSelectList<PolicyEnum>()" class="form-control"></select>

如果您需要[EnumMember(Value = "Admin")],您可以尝试

public static class ExtensionMethods
{
    public static IEnumerable<SelectListItem> GetEnumMemberSelectList<TEnum>(this IHtmlHelper htmlHelper) where TEnum : struct
    {
        return new SelectList(Enum.GetValues(typeof(TEnum)).OfType<Enum>()
            .Select(x =>
                new SelectListItem
                {
                    Text = x.EnumMemberValue(),
                    Value = x.ToString()
                }), "Value", "Text");
    }

    public static string EnumMemberValue(this Enum value)
    {
        FieldInfo field = value.GetType().GetField(value.ToString());

        EnumMemberAttribute attribute
                = Attribute.GetCustomAttribute(field, typeof(EnumMemberAttribute))
                    as EnumMemberAttribute;

        return attribute == null ? value.ToString() : attribute.Value;
    }
}

关于c# - 从 GetEnumSelectList<> 获取文本值而不是索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54167372/

相关文章:

c# - 将生成的 PDF 数据加载到 ASP.NET MVC 上的 IFRAME 中

visual-studio-2015 - ASP.NET Identity - 如何以编程方式创建用户时更改密码要求

azure - Azure 上的 IdentityServer4 invalid_token "The issuer is invalid",在 localhost 上工作

ASP.NET Core 身份 - UserManager 和 UserStore 问题

c# - 如何检索已编译方法的源文件?

c# - 如何从 ASP.NET 按钮进行 HTTP POST?

asp.net-mvc - BreadCrumb 跟踪 MVC3 和 Razor

c# - ASP.NET MVC - 我在数据库中存储和显示图像时遇到问题

c# - 如何使用 Shell32.SHGetFileInfo 在 Windows 7 上获取文件夹图标

c# - 'Enum : Type' 和简单的 'Enum' 有什么区别