J'essaie d'utiliser la Html.DropDownList
méthode d'extension mais je n'arrive pas à comprendre comment l'utiliser avec une énumération.
Disons que j'ai une énumération comme celle-ci:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Comment créer une liste déroulante avec ces valeurs à l'aide de la Html.DropDownList
méthode d'extension?
Ou est-ce que je préfère simplement créer une boucle for et créer les éléments Html manuellement?
c#
asp.net
asp.net-mvc
Kevin Pang
la source
la source
ASP.NET MVC
Je sais que je suis en retard à la fête à ce sujet, mais j'ai pensé que cette variante pourrait vous être utile, car celle-ci vous permet également d'utiliser des chaînes descriptives plutôt que des constantes d'énumération dans la liste déroulante. Pour ce faire, décorez chaque entrée d'énumération avec un attribut [System.ComponentModel.Description].
Par exemple:
Voici mon code:
Vous pouvez ensuite le faire à votre avis:
J'espère que cela vous aide!
** EDIT 2014-JAN-23: Microsoft vient de publier MVC 5.1, qui dispose désormais d'une fonctionnalité EnumDropDownListFor. Malheureusement, il ne semble pas respecter l'attribut [Description], de sorte que le code ci-dessus persiste. Voir la section Enum dans les notes de publication de Microsoft pour MVC 5.1.
Mise à jour: Il prend cependant en charge l' attribut Display
[Display(Name = "Sample")]
, donc on peut l'utiliser.[Mise à jour - vient de le remarquer, et le code ressemble à une version étendue du code ici: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , avec quelques ajouts. Si c'est le cas, l'attribution semblerait juste ;-)]
la source
System.Web.Mvc.Html
il dit queDropDownListFor
cela ne peut pas être trouvé, mais il ne peut pas non plus le résoudre. Vous devez le faire manuellementusing System.Web.Mvc.Html;
. Alors tu sais.Dans ASP.NET MVC 5.1 , ils ont ajouté l'
EnumDropDownListFor()
aide, donc pas besoin d'extensions personnalisées:Modèle :
Voir :
Utilisation de Tag Helper (ASP.NET MVC 6) :
la source
Je suis tombé sur le même problème, j'ai trouvé cette question et j'ai pensé que la solution fournie par Ash n'était pas ce que je cherchais; Devoir créer le HTML moi-même signifie moins de flexibilité par rapport à la
Html.DropDownList()
fonction intégrée.Il s'avère que C # 3 etc. rend cela assez facile. J'ai un
enum
appeléTaskStatus
:Cela crée un bon ol '
SelectList
qui peut être utilisé comme vous en avez l'habitude dans la vue:Le type anonyme et LINQ rendent cela beaucoup plus élégant à mon humble avis. Aucune infraction, Ash. :)
la source
select new { ID = (int)s, Name = s.ToString() };
Voici une meilleure solution encapsulée:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Dites voici votre modèle:
Exemple d'utilisation:
Interface utilisateur générée:
Et HTML généré
Instantané du code source de l'extension d'assistance:
Vous pouvez télécharger l'exemple de projet à partir du lien que j'ai fourni.
EDIT: Voici le code:
la source
Html.DropDownListFor ne nécessite qu'un IEnumerable, donc une alternative à la solution de Prise est la suivante. Cela vous permettra d'écrire simplement:
[Où SelectedItemType est un champ de votre modèle de type ItemTypes et votre modèle n'est pas nul]
De plus, vous n'avez pas vraiment besoin de généraliser la méthode d'extension car vous pouvez utiliser enumValue.GetType () plutôt que typeof (T).
EDIT: La solution de Simon intégrée ici aussi, et inclus la méthode d'extension ToDescription.
la source
Donc sans fonctions d'extension si vous cherchez simple et facile .. c'est ce que j'ai fait
où XXXXX.Sites.YYYY.Models.State est une énumération
Il vaut probablement mieux faire une fonction d'aide, mais lorsque le temps est court, cela fera le travail.
la source
En développant les réponses de Prize et Rune, si vous souhaitez que l'attribut value de vos éléments de liste sélectionnés soit mappé sur la valeur entière du type Enumeration, plutôt que sur la valeur de chaîne, utilisez le code suivant:
Au lieu de traiter chaque valeur d'énumération comme un objet TEnum, nous pouvons la traiter comme un objet, puis la convertir en entier pour obtenir la valeur non encadrée.
Remarque: J'ai également ajouté une contrainte de type générique pour restreindre les types pour lesquels cette extension est disponible aux seules structures (type de base d'Enum), et une validation de type au moment de l'exécution qui garantit que la structure transmise est bien une Enum.
Mise à jour 23/10/12: Ajout d'un paramètre de type générique pour le type sous-jacent et correction d'un problème de non-compilation affectant .NET 4+.
la source
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
ne compile pas. :(Pour résoudre le problème d'obtention du numéro au lieu du texte en utilisant la méthode d'extension de Prise.
la source
e
àint
.ID = Convert.ToInt32(e)
.Un moyen super facile de le faire - sans toutes les extensions qui semblent exagérées est la suivante:
Votre énumération:
À l'intérieur de votre contrôleur, liez l'énumération à une liste:
Après cela, jetez-le dans un ViewBag:
Enfin, liez-le simplement à la vue:
C'est de loin le moyen le plus simple que j'ai trouvé et ne nécessite aucune extension ou quelque chose d'aussi fou.
MISE À JOUR : Voir le commentaire d'Andrews ci-dessous.
la source
Level1 = 1
, alors la valeur de la liste déroulante serait"Level1"
au lieu de1
.La meilleure solution que j'ai trouvée pour cela était de combiner ce blog avec la réponse de Simon Goldstone .
Cela permet d'utiliser l'énumération dans le modèle. L'idée consiste essentiellement à utiliser une propriété entière ainsi que l'énumération et à émuler la propriété entière.
Utilisez ensuite l'attribut [System.ComponentModel.Description] pour annoter le modèle avec votre texte d'affichage et utilisez une extension "EnumDropDownListFor" dans votre vue.
Cela rend la vue et le modèle très lisibles et maintenables.
Modèle:
Vue:
Extension (directement à partir de la réponse de Simon Goldstone , incluse ici pour être complète):
la source
Vous souhaitez utiliser quelque chose comme
Enum.GetValues
la source
la source
Il s'agit des réponses Rune & Prize modifiées pour utiliser la
int
valeur Enum comme ID.Exemple d'énumération:
Méthode d'extension:
Échantillon d'utilisation:
N'oubliez pas d'importer l'espace de noms contenant la méthode d'extension
Exemple de HTML généré:
Notez que l'élément que vous utilisez pour appeler
ToSelectList
le est l'élément sélectionné.la source
Id = Convert.ToInt32(e)
.Ceci est une version pour Razor:
la source
Dans .NET Core, vous pouvez simplement utiliser ceci:
la source
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Maintenant, cette fonctionnalité est prise en charge prête à l'emploi dans MVC 5.1 à
@Html.EnumDropDownListFor()
Vérifiez le lien suivant:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
Il est vraiment dommage qu'il ait fallu 5 ans à Microsoft pour implémenter une fonctionnalité qui est si demandée selon le vote ci-dessus!
la source
En s'appuyant sur la réponse de Simon, une approche similaire consiste à obtenir les valeurs Enum à afficher à partir d'un fichier de ressources, plutôt que dans un attribut de description dans l'Enum lui-même. Cela est utile si votre site doit être rendu dans plusieurs langues et si vous avez un fichier de ressources spécifique pour Enums, vous pouvez aller plus loin et avoir juste des valeurs Enum dans votre Enum et les référencer à partir de l'extension en une convention telle que [EnumName] _ [EnumValue] - finalement moins de frappe!
L'extension ressemble alors à:
Les ressources du fichier Enums.Resx ressemblant à ItemTypes_Movie: Film
Une autre chose que j'aime faire est, au lieu d'appeler directement la méthode d'extension, je préfère l'appeler avec un @ Html.EditorFor (x => x.MyProperty), ou idéalement juste avoir le formulaire entier, dans un seul @ Html.EditorForModel (). Pour ce faire, je change le modèle de chaîne pour ressembler à ceci
Si cela vous intéresse, j'ai mis une réponse beaucoup plus détaillée ici sur mon blog:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
la source
Eh bien, je suis vraiment en retard à la fête, mais pour ce que ça vaut, j'ai blogué sur ce sujet même où je crée une
EnumHelper
classe qui permet une transformation très facile.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
Dans votre contrôleur:
À votre avis:
La classe d'assistance:
la source
Je suis très en retard sur celui-ci, mais je viens de trouver un moyen vraiment cool de le faire avec une seule ligne de code, si vous êtes heureux d'ajouter le package Melody NuGet Unconstrained (une jolie petite bibliothèque de Jon Skeet).
Cette solution est meilleure car:
Voici donc les étapes pour que cela fonctionne:
Ajoutez une propriété sur votre modèle comme ceci:
Maintenant que la liste de SelectListItem est exposée sur votre modèle, vous pouvez utiliser @ Html.DropDownList ou @ Html.DropDownListFor en utilisant cette propriété comme source.
la source
Un autre correctif à cette méthode d'extension - la version actuelle n'a pas sélectionné la valeur actuelle de l'énumération. J'ai fixé la dernière ligne:
la source
Si vous souhaitez ajouter une prise en charge de la localisation, remplacez simplement la méthode s.toString () par quelque chose comme ceci:
Ici, le typeof (Resources) est la ressource que vous souhaitez charger, puis vous obtenez la chaîne localisée, également utile si votre énumérateur a des valeurs avec plusieurs mots.
la source
Ceci est ma version de la méthode d'assistance. J'utilise ceci:
Au lieu de:
C'est ici:
la source
Vous pouvez également utiliser mes HtmlHelpers personnalisés dans Griffin.MvcContrib. Le code suivant:
Génère:
https://github.com/jgauffin/griffin.mvccontrib
la source
Je voudrais répondre à cette question d'une manière différente où, l'utilisateur n'a rien à faire dans
controller
ouLinq
expression. Par ici...j'ai un
ENUM
Maintenant, je peux simplement créer un
dropdown
en utilisant cecienum
.OU
Si vous souhaitez sélectionner un index, essayez ceci
Ici, j'ai utilisé
AccessLevelEnum.NoAccess
comme paramètre supplémentaire pour sélectionner par défaut la liste déroulante.la source
J'ai trouvé une réponse ici . Cependant, certaines de mes énumérations ont un
[Description(...)]
attribut, j'ai donc modifié le code pour prendre en charge cela:J'espère que cela pourra aider.
la source
@Simon Goldstone: Merci pour votre solution, elle peut parfaitement être appliquée dans mon cas. Le seul problème est que j'ai dû le traduire en VB. Mais maintenant c'est fait et pour gagner du temps aux autres (au cas où ils en auraient besoin) je le mets ici:
Fin Vous l'utilisez comme ceci:
la source
J'ai fini par créer des méthodes d'extension pour faire ce qui est essentiellement la réponse acceptée ici. La dernière moitié du Gist traite spécifiquement d'Enum.
https://gist.github.com/3813767
la source
la source
la source