92 votes

Utilisation d'un enum pour une liste déroulante dans ASP.NET MVC Core

J'essaie de créer une liste déroulante avec une propriété enum dans ASP.NET MVC Core en utilisant l'aide de tag dans une vue Razor :

Voici le modèle :

public class PersonalMember : Member
{
    [Required, Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required, Display(Name = "Last Name")]
    public string LastName { get; set; }

    [EnumDataType(typeof(Gender))]
    public Gender GenderType { get; set; }
}

public enum Gender
{
    Male = 1,
    Female = 2
}

Voici une partie d'un formulaire dans la vue :

<div class="form-group">
    <label asp-for="GenderType" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <select asp-for="GenderType" asp-items="Html.GetEnumSelectList<GenderType>()">
            <option selected="selected" value="">Please select</option>
        </select>
        <span asp-validation-for="GenderType" class="text-danger" />
    </div>
</div>

Le problème que j'ai est qu'après Html.GetEnumSelectList , GenderType n'est pas reconnu et s'affiche comme une erreur.

Quelqu'un sait-il comment résoudre ce problème ?

2 votes

Essayez de le spécifier comme... @(Html.GetEnumSelectList<GenderType>())"

136voto

Kostas Points 288

Je pense que tu as accidentellement utilisé GenderType au lieu de Gender . La syntaxe correcte est

<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()">
    <option selected="selected" value="">Please select</option>
</select>

11 votes

Cet article devrait être la réponse, il utilise les aides de balises modernes ET vous montre comment mettre en œuvre la fonction GetEnumSelectList<Enum>() pour construire l'élément de liste.

0 votes

Première suggestion qui a fonctionné pour moi dans .net core merci

1 votes

N'y a-t-il pas une méthode @Html.EnumDropdownFor qui puisse faire cela en une seule ligne ?

70voto

ADyson Points 20642

GenderType est le nom de votre propriété, et non le type Enum. La méthode GetEnumSelectList s'attend à ce que vous lui donniez le type de l'énumération, et non le nom de la propriété dans votre modèle.

Essayez ça :

Html.GetEnumSelectList<Gender>()

0 votes

Il faudrait peut-être les marquer comme des métadonnées dans l'asp-for like : Html.GetEnumSelectList<GenderType.Meta.Gender>() L'OP n'a pas indiqué quelle version du MVC-framework est utilisée.

0 votes

J'ai essayé Html.GetEnumSelectList<Gender>() et Html.GetEnumSelectList<enum Gender>() - ils affichent tous deux des erreurs

1 votes

Quelle erreur obtenez-vous lorsque vous utilisez mon exemple ci-dessus ? La même erreur ? Je ne pense pas que votre deuxième exemple soit une syntaxe valide.

28voto

Faishal Ahammad Points 122

Vous pouvez simplement utiliser la syntaxe Razor :

@Html.DropDownList("StudentGender", 
    Html.GetEnumSelectList<Gender>(),
    "Select Gender",new { @class = "form-control" })

1 votes

C'est en effet ce dont nous avons besoin !

7voto

Rogerio Azevedo Points 119

J'ai eu le même problème, je me suis brûlé la tête à chercher une solution !

Vous pouvez résoudre cette situation en instanciant votre modèle au dessus de votre vue comme suit :

@using CRM.Model;

@utilisant VotreSolution.Modèle

Oui, cela semble trop étrange mais croyez-moi, ça marche ! Voir ma réponse sur mon propre post.

Aide à la sélection de balises ENUM dans ASP.NET Core MVC

2voto

Mehdi Points 1

Vous utilisez Gender pour asp-items="Html.GetEnumSelectList -GenderType- ()" au lieu de GenderType

tel que asp-items="Html.GetEnumSelectList -Gender- ()"

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