137 votes

Comment écrire un simple Html.DropDownListFor() ?

Dans ASP.NET MVC 2, j'aimerais écrire une liste déroulante très simple qui donne des options statiques. Par exemple, j'aimerais offrir le choix entre "Rouge", "Bleu" et "Vert".

191voto

weirdlover Points 3493

Ver cet article de MSDN et un exemple d'utilisation ici sur Stack Overflow .

Disons que vous avez la classe Linq/POCO suivante :

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

Et disons que vous avez le modèle suivant :

public class PageModel 
{
   public int MyColorId { get; set; }
}

Et, enfin, disons que vous avez la liste de couleurs suivante. Elles peuvent provenir d'une requête Linq, d'une liste statique, etc :

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};

Dans votre vue, vous pouvez créer une liste déroulante comme suit :

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>

1 votes

C'est très clair. Je voudrais savoir où je dois mettre l'IEnumerable<Color> dans mon code ? Je sais que la question semble stupide mais je suis très perdue et nouvelle dans ce domaine :s

7 votes

Ne t'inquiète pas, mon ami. Je sais ce que ça fait :) Comme vous l'avez suggéré dans votre question initiale, s'agit-il d'une liste statique que vous allez créer en code, ou allez-vous tirer cette liste d'une base de données ?

0 votes

Une liste statique qui contient 4 options non frop une base de données

64voto

Berat Points 251
<%: 
     Html.DropDownListFor(
           model => model.Color, 
           new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   Model.Color
           )
        )
%>

ou vous pouvez ne pas écrire de classes, mettre quelque chose comme ceci directement dans la vue.

2 votes

Je reçois l'erreur suivante lorsque j'essaie votre code : "La référence de l'objet n'est pas fixée à une instance d'un objet".

14 votes

Mauvaise idée d'ajouter la logique du modèle à votre vue

37voto

Jules Bartow Points 419

Evitez de nombreux doigtés gras en commençant par un Dictionnaire dans le Modèle

namespace EzPL8.Models
{
    public class MyEggs
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},
                { 1, "I hate eggs"},
                { 2, "Over Easy"},
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };

    }

    }

Dans la vue, convertissez-le en une liste pour l'affichage.

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))

33voto

Voici comment je l'ai fait en un seul projet :

     @Html.DropDownListFor(model => model.MyOption,                
                  new List<SelectListItem> { 
                       new SelectListItem { Value = "0" , Text = "Option A" },
                       new SelectListItem { Value = "1" , Text = "Option B" },
                       new SelectListItem { Value = "2" , Text = "Option C" }
                    },
                  new { @class="myselect"})

J'espère que ça aidera quelqu'un. Merci

12voto

Joel Wahlund Points 43

Ou si c'est à partir d'un contexte de base de données vous pouvez utiliser

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))

7 votes

Tout d'abord, désolé pour les erreurs de grammaire, l'anglais n'étant pas ma langue maternelle. C'est toujours agréable de voir quelqu'un faire un commentaire aussi réfléchi, je vous félicite monsieur d'avoir pris le temps de contribuer. C'est aussi toujours rassurant de voir que la profession de développeur est entre de bonnes mains comme les vôtres, car les miennes ne suffisent pas. C'est à cause de votre commentaire ignorant que je ne poste plus ici. Puis-je vous informer que lorsque j'ai écrit ce texte, j'étais à 8 mois d'études et je n'avais jamais touché au développement Web auparavant. Je voulais partager une approche différente avec le peu de connaissances que j'avais.

8 votes

Depuis 8 mois ? Alors pourquoi essayer de résoudre des problèmes alors que vous ne savez pas comment faire ? Mon commentaire est loin d'être ignorant, je vois ce genre de choses jour après jour. Imaginez que vous avez une application d'entreprise avec des centaines de vues et que votre directeur technique veut passer à Oracle DB. Imaginez le coût réel du remaniement de toutes les vues et de tous les contrôleurs qui utilisent des listes déroulantes, juste à cause de votre seule ligne de code ! Je ne cherche pas à vous insulter, j'essaie simplement de vous expliquer comment un petit mauvais conseil peut avoir des effets énormes.

2 votes

Ce n'est pas différent de la nécessité de remanier les solutions statiques basées sur les enums. Au moins, il ne fallait pas modifier le code à chaque fois que l'entreprise voulait ajouter une couleur à la liste. Si plus de gens pensaient à utiliser réellement une base de données, le monde serait meilleur.

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