Comment dois-je remplir une liste déroulante avec les valeurs de l'enum?
J'ai un enum pour l'une des propriétés de mon point de vue-modèle. Je veux afficher une liste déroulante qui contient toutes les valeurs de l'enum. Je peux obtenir que cela fonctionne avec le code suivant.
Ce que je me pose est de savoir si il existe un moyen simple de convertir à partir d'un enum pour un IEnumerable? Je peux le faire manuellement comme dans l'exemple suivant, mais quand j'ajoute une nouvelle valeur d'enum le code des pauses. J'imagine que je peux le faire par la réflexion que par ce exemple, mais il existe d'autres moyens pour ce faire?
public enum Currencies
{
CAD, USD, EUR
}
public ViewModel
{
[Required]
public Currencies SelectedCurrency {get; set;}
public SelectList Currencies
{
List<Currencies> c = new List<Currencies>();
c.Add(Currencies.CAD);
c.Add(Currencies.USD);
c.Add(Currencies.EUR);
return new SelectList(c);
}
}
OriginalL'auteur yamspog | 2010-09-14
Vous devez vous connecter pour publier un commentaire.
Je suis à l'aide d'un helper que j'ai trouvé ici à remplir mes SelectLists avec un générique d'un type enum, j'ai fait une petite modification pour ajouter de la valeur sélectionnée bien, voici à quoi ça ressemble :
La bonne chose à ce sujet est qu'il lit les DisplayAttribute comme le titre plutôt que l'enum nom. (si votre enums contenir d'espaces ou vous avez besoin de localisation puis, il rend votre vie plus facile)
De sorte que vous aurez besoin d'ajouter l'Affichage attirubete à votre énumérations comme ceci :
et ce est la façon dont vous les utilisez dans vos vues.
Model.statusType
est juste un enum objet de typeUser_Status
.C'est tout , pas plus SelectLists dans votre Viewmodel. Dans mon exemple, je suis refrencing un enum dans mon ViewModel mais vous pouvez Refrence le type enum directement dans votre point de vue. Je fais juste ça pour faire de tout, propre et agréable.
De l'espoir qui a été utile.
Excellente solution en effet. Toutefois, si l'entrée dans l'enum n'a pas de description de l'attribut, il échoue. Remplacez donc
.First()
avec.FirstOrDefault()
et au lieu deitems.Add(value, attrs.GetName());
ontitems.Add(value, attrs != null ? attrs.GetName() : value.ToString());
Qui vous permet d'économiser de frappe dans la Description pour d'évidentes Enum entrées.fait, merci pour les corrections.
OriginalL'auteur Manaf Abu.Rous
Regarder Enum.Getnames a(typeof(Monnaies))
OriginalL'auteur Oleg D.
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.
OriginalL'auteur nootn
Donc beaucoup de bonnes réponses - j'ai pensé que j'sd ajouter ma solution, je suis la construction de la SelectList dans la vue (et pas dans le Contrôleur):
Dans mon c#:
Dans mon cshtml:
HTH
OriginalL'auteur Luchian
Est peut-être trop tard, mais je pense qu'il pourrait être utile pour les personnes avec le même problème.
J'ai trouvé ici que maintenant avec MVC 5 il est inclus un EnumDropDownListFor html helper qui les rend plus nécessaire le recours à de l'aide personnalisée ou à d'autres solutions de contournement.
Dans ce cas particulier, il suffit d'ajouter ceci:
et c'est tout!
Vous pouvez également traduire ou de modifier le texte affiché à l'écran via les annotations de données et des fichiers de ressources:
Ajouter les données suivantes annotations à votre enum:
Créer les ressources correspondantes fichier.
OriginalL'auteur redcap