51 votes

Liste déroulantePour valeur par défaut

Existe-t-il un moyen simple d'ajouter une option par défaut "--Please select--" à un DropDownListFor dans MVC 3 ?

78voto

itsmatt Points 18905

J'ai donc procédé de la manière suivante :

@Html.DropDownListFor(model => model.Dessert, 
                      new SelectList(Model.AvailableDesserts, "DessertID", "DessertName"),
                      "---Select A Dessert ---")

Il semble fonctionner assez bien. Dessert dans mon modèle de vue est celui sélectionné par l'utilisateur. AvailableDesserts est une collection de choix. J'espère que cela vous aidera.

2 votes

Cela ajoute un "--Please select--" en haut de la liste déroulante, mais la valeur par défaut est l'élément suivant de la liste déroulante, du moins dans mon exemple : @Html.DropDownListFor( x => x.SelectedTeamID, new SelectList(Model.Teams, "TeamID", "TeamName"), "--Please select--")

4 votes

Quelle est la valeur par défaut du SelectedTeamID que vous envoyez à la vue ? Dans mon Create.cshtml l'option "--- Select A Dessert ---" sera choisie par défaut (l'ID est un nombre entier et il est fixé par défaut à 0), alors que dans le cas de mon Edit.cshtml il prendra par défaut la valeur actuelle de l'option model.Dessert dans mon modèle de vue. Cela peut être dû au fait que mes DessertIds commencent à 1 (la clé primaire de ma table Desserts commence à 1). Ce n'est qu'une supposition. Je pense que c'est la raison pour laquelle cela se produit.

0 votes

Je crois que ce qu'il fait, c'est regarder la valeur actuelle du champ du modèle et essayer de la sélectionner par défaut. Par exemple, si vous construisez votre viewmodel (par exemple, pour un appel Create) et que vous définissez explicitement le SelectedTeamID à 6 et que vous le passez à la vue, celle-ci affichera le TeamName associé au TeamID 6, en supposant qu'il en existe un.

14voto

asawyer Points 10642

J'ai quelques méthodes d'extension sur SelectList

    public static SelectList PreAppend(this SelectList list, string dataTextField, string selectedValue, bool selected=false)
    {
        var items = new List<SelectListItem>();
        items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue });
        items.AddRange(list.Items.Cast<SelectListItem>().ToList());
        return new SelectList(items, "Value", "Text");
    }
    public static SelectList Append(this SelectList list, string dataTextField, string selectedValue, bool selected=false)
    {
        var items = list.Items.Cast<SelectListItem>().ToList();
        items.Add(new SelectListItem() { Selected = selected, Text = dataTextField, Value = selectedValue });
        return new SelectList(items, "Value", "Text");
    }
    public static SelectList Default(this SelectList list,string DataTextField,string SelectedValue)
    {
        return list.PreAppend(DataTextField, SelectedValue, true);
    }

Mon rasoir ressemble alors à.. :

@Html.DropDownListFor(m=>m.SelectedState, 
    Model.StateList().Default("Select One",""))

0 votes

Je suis novice en MVC, pouvez-vous me dire comment ajouter des méthodes d'extension à ma SelectList ?

3 votes

Ajoutez une classe statique à votre projet et ajoutez-y ces méthodes. Assurez-vous que la page à partir de laquelle vous essayez de les appeler importe l'espace de noms si ce n'est pas l'espace de noms global du projet. La syntaxe dans Razor est la suivante @using Myproject.Extensions ou quel que soit le nom que vous donnez à votre classe. Pour plus d'informations, veuillez lire : msdn.microsoft.com/en-us/library/bb383977.aspx

0 votes

Je préférerais l'option Helper/Extension que vous proposez, mais j'ai des problèmes de mise en œuvre. J'obtiens l'erreur suivante : Unable to cast object of type 'MyApp.UI.Models.Address' to type 'System.Web.Mvc.SelectListItem'. Le code que j'utilise est le suivant : @Html.DropDownListFor(m => m.EmailAddressID, new SelectList(Model.Addresses, "AddressID", "EmailAddress").PreAppend("---Select an Address---", "")) Il se compile correctement et est reconnu dans la vue, mais présente l'erreur ci-dessus au moment de l'exécution. La méthode codée en dur présentée par @itsmatt fonctionne. Des idées sur les modifications à apporter aux méthodes d'extension ?

3voto

jonbarlo Points 21

Bonjour, et si vous essayiez ceci (dans le cas où vous utilisez la méthode DisplayFor)

private IEnumerable<SelectListItem> AddDefaultOption(IEnumerable<SelectListItem> list, string dataTextField, string selectedValue)
    {
        var items = new List<SelectListItem>();
        items.Add(new SelectListItem() { Text = dataTextField, Value = selectedValue});
        items.AddRange(list);
        return items;
    }

Il suffit ensuite d'ajouter le code suivant à votre contrôleur

//lambda expression binding
ViewBag.YourList = db.YourTable.Select(x => x).ToList().Select(x => new SelectListItem
        {
            Value = x.Id.ToString(),
            Text = x.DisplayName.ToString()
        });

        ViewBag.YourList = AddDefaultOption(ViewBag.YourList, "Select One...", "null", true);

Enfin, au niveau de la vue, vous pouvez afficher une liste déroulante ou une boîte combinée, comme suit

    <div class="editor-label">
        Your Label
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.ForeignKey, (IEnumerable<SelectListItem>)ViewBag.YourList)
    </div>

0 votes

C'est bizarre que vous fassiez le .Select(x => x).ToList() avant le .Select(x => new SelectListItem Ce n'est pas nécessaire.

0voto

Rhyous Points 2163

Je voulais que la valeur par défaut soit celle du paramètre Url appelé SiteType :

    <div class="form-group">
        @Html.LabelFor(model => model.Type, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Type, ChangeOrderSite.SiteTypeNames.Select(s => new SelectListItem { Text = s.Value, Value = s.Key.ToString(), Selected = s.Key.ToString() == Request["SiteType"] }), new { @class = "control-label col-md-2" })
            @Html.ValidationMessageFor(model => model.Type)
        </div>
    </div>

Mon menu déroulant est une liste de types de sites.

0voto

RUDYLIB926 Points 3

J'aime la méthode suivante :

@Html.DropDownListFor(m => m.SelectedId, new SelectList(Model.Items, "Id", "Name"), new SelectListItem() { Text = "None", Value = "", Selected = true }.Text, new { @class = "form-control search-select-input btn btn-block btn-outline-secondary dropdown-toggle p-1" })

Où Items est un IEnumerable du type que vous souhaitez afficher dans la liste déroulante. Et vous pouvez changer les classes bootstrap que vous voulez dans le dernier paramètre.

Cette méthode vous permet de définir une étiquette par défaut et de spécifier la valeur de l'étiquette si nécessaire.

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