294 votes

Comment obtenir l'attribut Display Name d'un membre Enum via un code MVC Razor ?

J'ai une propriété dans mon modèle appelée Promotion que son type est un flag enum appelé UserPromotion . Les membres de mon enum ont des attributs d'affichage définis comme suit :

[Flags]
public enum UserPromotion
{
    None = 0x0,

    [Display(Name = "Send Job Offers By Mail")]
    SendJobOffersByMail = 0x1,

    [Display(Name = "Send Job Offers By Sms")]
    SendJobOffersBySms = 0x2,

    [Display(Name = "Send Other Stuff By Sms")]
    SendPromotionalBySms = 0x4,

    [Display(Name = "Send Other Stuff By Mail")]
    SendPromotionalByMail = 0x8
}

Maintenant, je veux pouvoir créer, disons, une ul dans ma vue pour montrer les valeurs sélectionnées de mon Promotion propriété. C'est ce que j'ai fait jusqu'à présent, mais le problème est le suivant : comment puis-je obtenir les noms d'affichage ici ?

<ul>
    @foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
    {
        var currentPromotion = (int)Model.JobSeeker.Promotion;
        if ((currentPromotion & aPromotion) == aPromotion)
        {
        <li>Here I don't know how to get the display attribute of "currentPromotion".</li>
        }
    }
</ul>

11voto

maximpa Points 1119

Vous pourriez utiliser Méthode Type.GetMember alors obtenir les informations sur les attributs en utilisant la réflexion :

// display attribute of "currentPromotion"

var type = typeof(UserPromotion);
var memberInfo = type.GetMember(currentPromotion.ToString());
var attributes = memberInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false);
var description = ((DisplayAttribute)attributes[0]).Name;

Il y a eu quelques messages similaires ici :

Obtenir les attributs de la valeur d'un Enum

Comment faire en sorte que le DisplayFor de MVC3 affiche la valeur de l'attribut d'affichage d'un Enum ?

10voto

Sea_Ocean Points 309

Pour ASP.Net Core 3.0, cela a fonctionné pour moi (merci aux personnes ayant répondu aux questions précédentes).

Ma classe Enum :

using System;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.Reflection;

public class Enums
{
    public enum Duration
    { 
        [Display(Name = "1 Hour")]
        OneHour,
        [Display(Name = "1 Day")]
        OneDay
    }

    // Helper method to display the name of the enum values.
    public static string GetDisplayName(Enum value)
    {
        return value.GetType()?
       .GetMember(value.ToString())?.First()?
       .GetCustomAttribute<DisplayAttribute>()?
       .Name;
    }
}

Ma classe de modèle de vue :

public class MyViewModel
{
    public Duration Duration { get; set; }
}

Un exemple de vue de rasoir affichant une étiquette et une liste déroulante. Remarquez que la liste déroulante ne nécessite pas de méthode d'aide :

@model IEnumerable<MyViewModel> 

@foreach (var item in Model)
{
    <label asp-for="@item.Duration">@Enums.GetDisplayName(item.Duration)</label>
    <div class="form-group">
        <label asp-for="@item.Duration" class="control-label">Select Duration</label>
        <select asp-for="@item.Duration" class="form-control"
            asp-items="Html.GetEnumSelectList<Enums.Duration>()">
        </select>
    </div>
}

8voto

Deniz aydın Points 91

Avec Core 2.1,

public static string GetDisplayName(Enum enumValue)
{
  return enumValue.GetType()?
 .GetMember(enumValue.ToString())?[0]?
 .GetCustomAttribute<DisplayAttribute>()?
 .Name;
}

7voto

avs099 Points 4455

En combinant tous les cas de figure ci-dessus :

  • les membres de l'énumération avec les noms des membres de l'objet de base ( Equals , ToString )
  • en option Display attribut

Voici mon code :

public enum Enum
{
    [Display(Name = "What a weird name!")]
    ToString,

    Equals
}

public static class EnumHelpers
{
    public static string GetDisplayName(this Enum enumValue)
    {
        var enumType = enumValue.GetType();

        return enumType
                .GetMember(enumValue.ToString())
                .Where(x => x.MemberType == MemberTypes.Field && ((FieldInfo)x).FieldType == enumType)
                .First()
                .GetCustomAttribute<DisplayAttribute>()?.Name ?? enumValue.ToString();
    }
}

void Main()
{
    Assert.Equals("What a weird name!", Enum.ToString.GetDisplayName());
    Assert.Equals("Equals", Enum.Equals.GetDisplayName());
}

6voto

Dmytro Tsiniavskyi Points 3126
<ul>
    @foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
    {
        var currentPromotion = (int)Model.JobSeeker.Promotion;
        if ((currentPromotion & aPromotion) == aPromotion)
        {
        <li>@Html.DisplayFor(e => currentPromotion)</li>
        }
    }
</ul>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X