web-dev-qa-db-fra.com

Nom d'affichage de la liste déroulante enum dans Razor

Comment puis-je afficher les noms personnalisés de mes énumérations dans la liste déroulante dans Razor? Mon code actuel est:

@Html.DropDownListFor(model => model.ExpiryStage,
        new SelectList(Enum.GetValues(typeof(ExpiryStages))),
        new { @class = "selectpicker" })

Mon enum est:

public enum ExpiryStages
{
    [Display(Name = "None")]
    None = 0,

    [Display(Name = "Expires on")]
    ExpiresOn = 1,

    [Display(Name = "Expires between")]
    ExpiresBetween = 2,

    [Display(Name = "Expires after")]
    ExpiresAfter = 3,

    [Display(Name = "Current")]
    Current = 4,

    [Display(Name = "Expired not yet replaced")]
    ExpiredNotYetReplaced = 5,

    [Display(Name = "Replaced")]
    Replaced = 6
}

Par exemple, je souhaite afficher "Expired pas encore remplacé" au lieu de ExpiredNotYetReplaced dans ma DropDownList.

18
rajeemcariazo

À partir de MVC 5.1, ils ont ajouté ce nouvel assistant. Vous avez juste besoin d'un enum

public enum WelcomeMessageType
    {
        [Display(Name = "Prior to accepting Quote")]
        PriorToAcceptingQuote,
        [Display(Name = "After Accepting Quote")]
        AfterAcceptingQuote
    }

et vous pouvez créer la liste déroulante montrant les noms en écrivant

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

J'ai une extension enum pour récupérer le nom d'affichage.

public static string GetDescription<TEnum>(this TEnum value)
{
    var attributes = value.GetAttributes<DescriptionAttribute>();
    if (attributes.Length == 0)
    {
       return Enum.GetName(typeof(TEnum), value);
    }

    return attributes[0].Description;
}

Que vous pouvez utiliser comme ceci:

Enum.GetValues(typeof(ExpiryStages)).Select(e => new { Id = Convert.ToInt32(e), Name = e.GetDescription() });

J'utilise un assistant pratique pour générer des listes de sélection à partir d'énums:

public static SelectList SelectListFor<T>() 
        where T : struct
{
    var t = typeof (T);

    if(!t.IsEnum)
    {
        return null;
    }

    var values = Enum.GetValues(typeof(T)).Cast<T>()
                   .Select(e => new { Id = Convert.ToInt32(e), Name = e.GetDescription() });

    return new SelectList(values, "Id", "Name");
}
4
James Hull

vous pouvez utiliser pour le noyau asp.net 

                    <select asp-for="DeliveryPolicy" asp-items="Html.GetEnumSelectList<ExpiryStages>()">
                        <option selected="selected" value="">Please select</option>
                    </select>
1
Zubayer Bin Ayub

Dans ASP.Net Core, vous pouvez utiliser la méthode HtmlHelper IHtmlHelper.GetEnumSelectList () , qui peut être utilisée comme suit, par exemple: 

asp-items="@Html.GetEnumSelectList<MyEnumType>()"
1
bergmeister