Comment voulez-vous créer une liste déroulante à partir d'un enum ASP.NET MVC?
Je suis en train d'utiliser le Html.DropDownList
méthode d'extension, mais ne peut pas comprendre comment l'utiliser avec une énumération.
Disons que j'ai une énumération comme ceci:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Comment puis-je créer une liste déroulante avec ces valeurs à l'aide de la Html.DropDownList
méthode d'extension?
Ou est mon meilleur pari pour créer simplement une boucle for et de créer les éléments Html manuellement?
Vous devez vous connecter pour publier un commentaire.
Pour MVC v5.1 utiliser le langage Html.EnumDropDownListFor
Pour MVC v5 utilisation EnumHelper
Pour MVC 5 et inférieur
J'ai roulé Rune de réponse dans une méthode d'extension:
Cela permet d'écrire:
par
using MyApp.Common
ASP.NET MVC
il est originaire façon: stackoverflow.com/a/22295360/1361084var values = from TEnum e in Enum.GetValues(typeof(TEnum)) select new { Id = (int)e, Name = e.ToString() };
Je sais je suis en retard à la fête, mais pensé que vous pourriez trouver cette variante utile, comme celle-ci vous permet également d'utiliser des chaînes descriptifs plutôt que de dénombrement des constantes dans la liste déroulante. Pour ce faire, décorer chaque énumération entrée avec un [Système.ComponentModel.Description] attribut.
Par exemple:
Voici mon code:
Ensuite, vous pouvez le faire dans votre vue:
Espère que cela vous aide!
**ÉDITION 2014-JAN-23: Microsoft vient de publier MVC 5.1, qui a maintenant un EnumDropDownListFor fonctionnalité. Malheureusement, il ne semble pas respecter les [Description] l'attribut de sorte que le code ci-dessus est toujours debout.Voir Enum section Microsoft notes de mise à jour pour MVC 5.1.
Mise à jour: Il prend en charge la Affichage attribut
[Display(Name = "Sample")]
, donc on peut l'utiliser.[Mise à jour - juste remarqué cela, et le code ressemble à une version étendue de la code ici: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums/, avec quelques ajouts. Si oui, l'attribution semble juste ;-)]
System.Web.Mvc.Html
puis il est dit queDropDownListFor
ne peut pas être trouvé, mais elle ne peut le résoudre. Vous avez à faire manuellementusing System.Web.Mvc.Html;
. Tellement tu sais.Selected = value.Equals(metadata.Model)
ne sera pas vraiment affecter parce que MVC rendra la liste déroulante la valeur sélectionnée selon le modèle de la valeur de la propriété à l'intérieur de la variable d'expression.Dans ASP.NET MVC 5.1, ils ont ajouté la
EnumDropDownListFor()
helper, donc pas besoin d'extensions personnalisées:Modèle:
Vue:
À l'aide de la Balise Helper (ASP.NET MVC 6):
@Html.DropDownListFor(m => m.MyProperty, @Html.GetEnumSelectList(typeof(MyTypes.MyModel)))
Je suis tombé sur le même problème, trouve cette question, et de la pensée que la solution fournie par Ash n'était pas ce que je cherchais, d'Avoir à créer le code HTML de me signifie moins de flexibilité par rapport à la
Html.DropDownList()
fonction.S'avère C#3 etc. c'est assez facile. J'ai un
enum
appeléTaskStatus
:Ce qui crée un bon ol'
SelectList
qui peuvent être utilisés comme vous êtes habitué à la vue:Le type anonyme et LINQ qui rend ce beaucoup plus élégant à mon humble avis. Aucune infraction, l'intention, de la Cendre. 🙂
select new { ID = (int)s, Name = s.ToString() };
enum
, Visual Studio ne vous laisse pas faire que de fonte. Il vous ditCannot convert type 'TEnum' to 'int'
. 🙁 (Je suis en utilisant le accepté le code de réponse, BTW)Voici une meilleure encapsulé solution:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Dire ici, c'est votre modèle:
Exemple D'Utilisation:
Généré de l'INTERFACE utilisateur:
Et HTML généré
Le Helper Code Source de l'Extension snap shot:
Vous pouvez télécharger l'exemple de projet à partir du lien que j'ai fourni.
EDIT: Voici le code:
Html.DropDownListFor ne nécessite qu'un IEnumerable, donc une alternative à la Prise de la solution est la suivante. Cela vous permettra d'écrire tout simplement:
[Où SelectedItemType est un domaine sur votre modèle de type ItemTypes, et votre modèle est non-null]
Aussi, vous n'avez pas vraiment besoin de genericize l'extension de la méthode que vous pouvez utiliser enumValue.GetType() plutôt que typeof(T).
EDIT: Intégré Simon solution ici, et inclus ToDescription méthode d'extension.
Sans fonctions d'Extension si vous êtes à la recherche pour simple et facile.. C'est ce que j'ai fait
où XXXXX.Sites.AAAA.Modèles.L'état est un enum
Probablement mieux à faire fonction d'assistance, mais quand le temps est court, cela va faire le travail.
Expansion sur la Prise et de la Rune de réponses, si vous voulez avoir la valeur de l'attribut de votre liste de sélection des éléments de la carte à la valeur entière de type Énumération, plutôt que de la chaîne de valeur, utilisez le code suivant:
Au lieu de traiter chaque valeur de l'Énumération comme un TEnum objet, on peut le traiter comme un objet, puis de le convertir en entier pour obtenir le décaissement de la valeur.
Remarque:
J'ai également ajouté un type générique contrainte de restreindre les types pour lesquels cette extension est disponible pour seulement les structures (Enum type de base), et un type à l'exécution de validation qui s'assure que la structure transmis est en effet un Enum.
Mise à jour 10/23/12:
Ajouté le paramètre de type générique de type sous-jacent et de la correction de la non-compilation question touchant .NET 4+.
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
ne compile pas. 🙁Pour résoudre le problème d'avoir le numéro au lieu de texte à l'aide de la Prise de la méthode d'extension.
e
àint
.ID = Convert.ToInt32(e)
.Un moyen super facile à obtenir ce fait, sans toutes les extension des trucs qui me semble overkill est-ce:
Votre enum:
À l'intérieur de votre contrôleur de lier l'énumération d'une Liste:
Après que les jetez pas dans un ViewBag:
Enfin il suffit de se lier à la Vue:
C'est de loin la façon la plus simple que j'ai trouvé et ne nécessitent pas d'extensions ou quelque chose de fou.
Mise à JOUR: Voir Andrews commentaire ci-dessous.
Level1 = 1
, puis la liste déroulante la valeur serait"Level1"
au lieu de1
.La meilleure solution que j'ai trouvé pour cet été combinant ce blog avec Simon Goldstone réponse.
Cela permet l'utilisation d'enum dans le modèle. Essentiellement, l'idée est d'utiliser un nombre entier de propriété ainsi que l'enum, et imiter l'entier de la propriété.
Puis utilisez le bouton [System.ComponentModel.Description] attribut pour annoter le modèle avec votre texte d'affichage, et l'utilisation d'un "EnumDropDownListFor" extension de votre point de vue.
Ce fait à la fois la vue et le modèle très lisible et maintenable.
Modèle:
Vue:
Extension (directement à partir de Simon Goldstone réponse, inclus ici par souci d'exhaustivité):
Que vous voulez regarder en utilisant quelque chose comme
Enum.GetValues
C'est la Rune & Prise réponses modifié pour utiliser le protocole Enum
int
valeur de l'ID.Échantillon Enum:
Méthode d'Extension:
Exemple d'utilisation:
N'oubliez pas d'Importer l'espace de noms qui contient la méthode d'Extension
Échantillon de code HTML généré:
Noter que l'élément que vous utilisez pour appeler le
ToSelectList
sur l'élément sélectionné.Id = Convert.ToInt32(e)
.C'est la version pour Rasoir:
Maintenant cette fonctionnalité est prise en charge out-of-the-box en MVC 5.1 à
@Html.EnumDropDownListFor()
Consulter le lien suivant:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
C'est vraiment la honte qu'il a fallu à Microsoft 5 ans pour mettre en œuvre telles que la fonction, qui est donc de la demande selon le vote ci-dessus!
Bâtiment sur Simon réponse, une approche similaire est d'obtenir les valeurs Enum d'affichage à partir d'un fichier de Ressources, au lieu d'un attribut de description au sein de l'Enum lui-même. Ceci est utile si votre site doit être rendu dans plus d'une langue et si vous avez un spécifique de fichier de ressources pour les Enums, vous pouvez aller plus loin et ont simplement les valeurs de l'Enum, dans votre Enum et de référence de l'extension par une convention telle que [EnumName]_[EnumValue] - en fin de compte moins de frappe!
L'extension ressemble alors à:
Ressources dans les Énumérations.Fichier Resx à la recherche comme
ItemTypes_Movie : Film
Une autre chose que j'aimerais faire, c'est, au lieu d'appeler la méthode d'extension directement, je préfère l'appeler avec un @Html.EditorFor(x => x.MyProperty), ou idéalement juste d'avoir l'ensemble du formulaire, dans l'une des plus intéressantes @Html.EditorForModel(). Pour ce faire, j'ai changer le modèle de chaîne de ressembler à cette
Si cela vous intéresse, j'ai mis beaucoup de réponse plus détaillée ici sur mon blog:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
Eh bien, je suis vraiment en retard à la fête, mais pour ce qu'il vaut, j'ai blogué sur ce sujet, où je créer un
EnumHelper
classe qui permet très facilement de transformation.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
Dans votre contrôleur:
De votre point de Vue:
La classe helper:
Dans .NET Core, vous pouvez utiliser seulement ceci:
Je suis très en retard sur ce un seul mais je viens de trouver une façon vraiment cool à faire avec une seule ligne de code, si vous êtes heureux de les ajouter à la Sans Contrainte Mélodie package NuGet (une belle, petite bibliothèque de Jon Skeet).
Cette solution est mieux parce que:
Donc, voici les étapes pour obtenir ce travail:
Ajouter une propriété sur votre modèle comme suit:
Maintenant que vous avez la Liste des SelectListItem exposées sur votre modèle, vous pouvez utiliser le @Html.DropDownList ou @Html.DropDownListFor l'aide de cette propriété en tant que source.
Un correctif pour cette extension de la méthode de la version actuelle ne sélectionnez pas l'enum de la valeur actuelle. J'ai corrigé la dernière ligne:
Si vous voulez ajouter le support de localisation il suffit de changer le s.méthode toString() pour quelque chose comme ceci:
Ici la typeof(Ressources) est la ressource que vous souhaitez charger, et puis, vous obtenez la Chaîne localisée, également utile si votre agent recenseur a des valeurs avec plusieurs mots.
C'est ma version de la méthode d'assistance.
J'utilise ceci:
Au lieu de:
Ici, il est:
Vous pouvez également utiliser mon personnalisée HtmlHelpers dans les Griffin.MvcContrib. Le code suivant:
Génère:
https://github.com/jgauffin/griffin.mvccontrib
J'aimerais répondre à cette question d'une autre manière, l'utilisateur n'a pas besoin de faire quoi que ce soit
controller
ouLinq
expression. De cette manière...J'ai un
ENUM
Maintenant, je canto, il suffit de créer un
dropdown
en utilisant ceenum
.OU
Si vous voulez faire un index sélectionné, puis essayez ce
Ici, j'ai utilisé
AccessLevelEnum.NoAccess
comme un paramètre supplémentaire pour la valeur par défaut en sélectionnant le menu déroulant.J'ai trouvé une réponse ici. Toutefois, certains de mes énumérations ont
[Description(...)]
attribut, donc j'ai modifié le code pour apporter son soutien:Espère que ça aide.
@Simon Goldstone: Merci pour votre solution, il peut être parfaitement appliqué dans mon cas. Le seul problème est que j'ai eu à le traduire dans VB. Mais maintenant c'est fait et pour sauver du temps aux autres (dans le cas où ils en ont besoin) je l'ai mis ici:
Fin Vous l'utiliser comme ceci:
J'ai fini par créer l'extension des méthodes pour faire ce qui est, essentiellement, d'accepter de répondre ici. La dernière moitié de la Gist traite Enum spécifiquement.
https://gist.github.com/3813767
Ici un Martin Faartoft variation où vous pouvez mettre des étiquettes personnalisées qui est agréable pour la localisation.
Utilisation:
J'ai fait la suite et fonctionne avec succès:
@modèle Monmodèle.cs
Monmodèle.cs
Dans MVC4, je ferais comme ceci
1 - Créer votre ENUM
2 - Créer votre Classe de Service
3 - Définir le ViewBag dans votre contrôleur
4 - Lier votre DropDownList
Mis à JOUR - je voudrais suggérer à l'aide de la suggestion par Rune ci-dessous plutôt que cette option!
Je suppose que vous voulez quelque chose comme ce qui suit recraché:
ce qui peut se faire avec une méthode d'extension à quelque chose comme:
MAIS ce genre de choses ne sont pas localisable (c'est à dire qu'il sera difficile de les traduire dans une autre langue).
Remarque: vous devez appeler la méthode statique avec une instance de l'Énumération, c'est à dire
Html.DropdownEnum(ItemTypes.Movie);
Il peut y avoir une façon plus élégante de le faire, mais le ci-dessus ne fonctionne pas.