1
votes

Obtenir la valeur de texte de GetEnumSelectList <> pas la valeur d'index

GetEnumSelectList renvoie une valeur d'index et non la valeur de texte. Comment obtenir la valeur du texte?

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>


1 commentaires

Veuillez ajouter le code à l'origine du problème et le résultat réel / attendu pour clarifier davantage la question.


4 Réponses :


0
votes

vous devez décorer votre énumération avec un attribut Description Exemple public enum SomeEnum { [Display (Name = "First")] Premier = 1, [Display (Name = "Second")] Seconde = 2 }


1 commentaires

J'ai essayé ça et ça. public enum PolicyEnum {[EnumMember (Value = "SuperAdmin")] SuperAdmin, [EnumMember (Value = "Admin")] Admin, [EnumMember (Value = "User")] User, [EnumMember (Value = "ClientAdmin")] ClientAdmin, [EnumMember (Value = "ClientUser")] ClientUser}



0
votes

Après avoir décoré votre Enum avec une description, vous pouvez l'utiliser:

internal static string GetDescription(Enum value)
{
    var attributes = value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
    return attributes.Length == 0 ? value.ToString() : ((DescriptionAttribute) attributes[0]).Description;
}


0 commentaires

1
votes

Si vous n'avez besoin que de SuperAdmin , vous pouvez définir l'extension ci-dessous:

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;
    }
}

Et utilisation:

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

Si vous avez besoin de [EnumMember (Value = "Admin")] , vous pouvez essayer

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");
    }       
}


0 commentaires

0
votes

Au lieu de ceci:

@Html.EnumDropDownListFor(model => model.PolicyEnum, null, new { @id = "ddlPolicyEnum", @class = "form-control", @style = "width:200px;" })

Utilisez ceci:

public enum PolicyEnum
{
     [Display(Name="First")]
     First = 1,
     [Display(Name="Second")]
     Second = 2
} 

et conservez l'affichage pour enum.

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

Depuis MVC5.1, vous pouvez également utiliser cet assistant:

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


0 commentaires