J'ai une propriété dans mon modèle appelée "Promotion" dont le type est une énumération d'indicateurs appelée "UserPromotion". Les membres de mon énumération 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 un ul dans ma vue pour montrer les valeurs sélectionnées de ma propriété "Promotion". C'est ce que j'ai fait jusqu'à présent, mais le problème est que 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>
c#
asp.net-mvc
razor
displayattribute
Pejman
la source
la source
System.ComponentModel.DataAnnotations.DisplayAttribute
. NonSystem.ComponentModel.DisplayNameAttribute
.Réponses:
METTRE À JOUR
La première solution était axée sur l'obtention des noms d'affichage à partir d'énumération. Le code ci-dessous devrait être la solution exacte à votre problème.
Vous pouvez utiliser cette classe d'assistance pour les énumérations:
Et puis vous pouvez l'utiliser dans votre vue comme suit:
J'espère que ça aide! :)
la source
.ToString
, mais à partir de stackoverflow.com/q/483794/179311 , il est dit d'utiliser à laEnum.GetName
place.GetDisplayValue
vous devez d' abord testerdescriptionAttributes == null
avant d'essayer d'accéder au tableau:descriptionAttributes[0]
. Sinon, vous pouvez déclencher une exception et la ligne ci-dessous où vous vérifiez la valeur null ne sera jamais vraie.One liner - Syntaxe fluide
Exemple
Production
la source
.NET Framework 4.5
et que vous incluez les espaces de noms suivantsSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
une terrible convention de dénomination? Il récupère l'attribut que vous spécifiez et utilise la casse pascal comme toutes les méthodes publiques.S'appuyant sur la grande réponse d'Aydin , voici une méthode d'extension qui ne nécessite aucun paramètre de type.
REMARQUE: GetName () doit être utilisé à la place de la propriété Name. Cela garantit que la chaîne localisée sera renvoyée si vous utilisez la propriété d'attribut ResourceType.
Exemple
Pour l'utiliser, il vous suffit de référencer la valeur d'énumération dans votre vue.
Production
Promotion: envoyer des offres d'emploi par courrier
la source
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, qui ne fonctionnera pas, car ils s'attendent à ce que l'expression évaluée produise une propriété ou quelque chose de similaire. Vous devriez utiliser la valeur d'énumération nue comme dans l'exemple ci-dessus.GetCustomAttribute<DisplayAttribute>()
parce que pour certains énumérations, cela n'est peut-être pas présent. Il revient àenumValue.ToString()
si le DisplayAttribute n'était pas présent.List<SelectListItem>
qui était rempli par un Enum avec toutes lesDisplayAttribute.Name
annotations individuelles - cela a parfaitement fonctionné, merci !!public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
Sur la base de la réponse d'Aydin, je suggérerais une implémentation moins "duplicative" (car nous pourrions facilement obtenir
Type
laEnum
valeur elle-même, au lieu de la fournir comme paramètre 😉:EDIT (basé sur le commentaire de @Vahagn Nahapetyan)
Maintenant, nous pouvons l'utiliser très propre de cette façon:
Ce qui se traduit par
la source
this
doit être une valeur Enum valide (et non nulle). Sinon, appeler la méthode lancerait déjà (ce qui est une responsabilité du code appelant). Cela fait que celaGetType()
fournira à coup sûr le type d'énumération correct dans lequelenumvalue
sera certainement membre. Mais GetCustomAttribute peut renvoyer une valeur nulle, j'ai donc fourni une version non exceptionnelle de la méthode pour renvoyer null lorsque la chaîne d'appels de méthode a une valeur de retour nulle quelque part. Merci!Si vous utilisez MVC 5.1 ou supérieur, il existe un moyen plus simple et plus clair: utilisez simplement l'annotation des données (à partir de l'
System.ComponentModel.DataAnnotations
espace de noms) comme ci-dessous:Et en vue, mettez-le dans le bon assistant html:
la source
Vous pouvez utiliser la méthode Type.GetMember , puis obtenir les informations d'attribut à l' aide de la réflexion:
Il y avait quelques articles similaires ici:
Obtenir des attributs de la valeur d'Enum
Comment faire pour que MVC3 DisplayFor affiche la valeur d'un attribut d'affichage Enum?
la source
S'appuyant sur la grande réponse de Todd qui s'appuyait sur la grande réponse d' Aydin , voici une méthode d'extension générique qui ne nécessite aucun paramètre de type.
J'en avais besoin pour mon projet parce que quelque chose comme le code ci-dessous, où tous les membres de l'énumération
DisplayAttribute
n'en ont pas, ne fonctionne pas avec la solution de Todd:S'il s'agit d'une solution compliquée à un problème simple, faites-le moi savoir, mais c'est le correctif que j'ai utilisé.
la source
la source
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
J'ai deux solutions pour cette question.
la source
Pour ASP.Net Core 3.0, cela a fonctionné pour moi (crédit aux répondeurs précédents).
Ma classe Enum:
Ma classe de modèles d'affichage:
Un exemple d'une vue de rasoir affichant une étiquette et une liste déroulante. Notez que la liste déroulante ne nécessite pas de méthode d'assistance:
la source
Vous devez utiliser un peu de réflexion pour accéder à cet attribut:
Je recommande d'encapsuler cette méthode dans une méthode d'extension ou de l'exécuter dans un modèle de vue.
la source
Avec Core 2.1,
la source
combiner tous les cas de bord ensemble par le haut:
Equals
,ToString
)Display
attribut facultatifvoici mon code:
la source
Je suis désolé de le faire, mais je n'ai pu utiliser aucune des autres réponses telles quelles et je n'ai pas eu le temps d'en parler dans les commentaires.
Utilise la syntaxe C # 6.
la source
S'appuyant sur les réponses d'Aydin et Todd, voici une méthode d'extension qui vous permet également d'obtenir le nom à partir d'un fichier de ressources
et l'utiliser comme
la source
Je souhaite contribuer avec l'extension d'énumération GetDisplayName dépendante de la culture. J'espère que cela sera utile pour quiconque googler cette réponse comme moi précédemment:
façon "standard" comme Aydin Adn et Todd l'ont mentionné:
Méthode "dépendante de la culture":
la source
Mise à jour 2020: une version mise à jour de la fonction fournie par beaucoup dans ce fil, mais maintenant pour C # 7.3 à partir de:
Vous pouvez maintenant restreindre les méthodes génériques aux types d'énumérations afin que vous puissiez écrire une seule extension de méthode pour l'utiliser avec toutes vos énumérations comme ceci:
La méthode d'extension générique:
L'énumération:
Comment l'utiliser:
Bonus, énumérations avec indicateurs: si vous avez affaire à des énumérations normales, la fonction ci-dessus est suffisante, mais si l'une de vos énumérations peut prendre plusieurs valeurs avec l'utilisation d'indicateurs, vous devrez la modifier comme ceci (ce code utilise C # 8 fonctionnalités):
L'énumération avec des drapeaux:
Comment l'utiliser:
la source
Sur la base des réponses précédentes, j'ai créé cette aide confortable pour prendre en charge toutes les propriétés DisplayAttribute d'une manière lisible:
la source
J'ai essayé de faire cela comme un montage mais cela a été rejeté; Je ne vois pas pourquoi.
Ce qui précède lèvera une exception si vous l'appelez avec un Enum qui a un mélange d'attributs personnalisés et d'éléments simples, par exemple
J'ai donc légèrement modifié le code pour vérifier les attributs personnalisés avant d'essayer d'y accéder et d'utiliser le nom s'il n'en trouve aucun.
la source
En utilisant MVC5, vous pouvez utiliser:
alors si vous voulez créer un sélecteur déroulant, vous pouvez utiliser:
la source