MVC3 DropDownListFor - un exemple simple?

112

J'ai des problèmes avec DropDownListFormon application MVC3. J'ai pu utiliser StackOverflow pour comprendre comment les faire apparaître sur la vue, mais maintenant je ne sais pas comment capturer les valeurs dans ses propriétés correspondantes sur le modèle de vue lorsqu'il est soumis. Pour que cela fonctionne, je devais créer une classe interne qui avait un ID et une propriété de valeur, puis je devais utiliser un IEnumerable<Contrib>pour satisfaire les DropDownListForexigences des paramètres. Maintenant, cependant, comment MVC FW est-il censé mapper la valeur sélectionnée dans cette liste déroulante dans la propriété de chaîne simple sur mon modèle de vue?

public class MyViewModelClass
{
    public class Contrib
    {
        public int ContribId { get; set; }
        public string Value { get; set; }
    }

    public IEnumerable<Contrib> ContribTypeOptions = 
        new List<Contrib>
        {
            new Contrib {ContribId = 0, Value = "Payroll Deduction"},
            new Contrib {ContribId = 1, Value = "Bill Me"}
        };

    [DisplayName("Contribution Type")]
    public string ContribType { get; set; }
}

Dans ma vue, je place le menu déroulant sur la page comme ceci:

<div class="editor-label">
    @Html.LabelFor(m => m.ContribType)
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m.ContribTypeOptions.First().ContribId, 
             new SelectList(Model.ContribTypeOptions, "ContribId", "Value"))
</div>

Lorsque je soumets le formulaire, le formulaire ContribTypeest (bien sûr) nul.

Quelle est la bonne façon de procéder?

Trey Carroll
la source

Réponses:

166

Vous devriez faire comme ceci:

@Html.DropDownListFor(m => m.ContribType, 
                new SelectList(Model.ContribTypeOptions, 
                               "ContribId", "Value"))

Où:

m => m.ContribType

est une propriété où la valeur du résultat sera.

Sergey Gavruk
la source
2
MERCI!!! Sergey, c'est exactement ce que je cherchais depuis de nombreuses heures.
Trey Carroll
Merci :) pour votre réponse. Existe-t-il un moyen d'afficher "- Sélectionnez--" à partir d'ici. ?
kbvishnu
1
@VeeKeyBee, vous pouvez ajouter un nouvel élément à la liste contribTypeOptions, par exemple new Contrib {ContribId = -1, Value = "Please Select"}et il sera affiché dans la liste déroulante. Que vous pouvez vérifier si ContribTypeest -1c'est signifie que l' utilisateur n'a pas sélectionné de valeur
Sergey Gavruk
9
Vous pouvez faire ceci:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
Sergey Gavruk
1
@SergeyGavruk. Cette réponse a été utilisée comme dupe sur quelques questions récentes mais déroute certains utilisateurs à cause de l'instruction Et le dernier paramètre du constructeur de liste Select est une valeur sélectionnée - Le dernier paramètre est ignoré par la méthode (qui construit le sien en interne SelectList) . C'est la valeur de la propriété ( ContribType) qui détermine ce qui est sélectionné (c'est ainsi que fonctionne la liaison de modèle) et le code devrait simplement être @Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")Pouvez-vous s'il vous plaît éditer la réponse pour corriger.
7

Je pense que cela aidera: dans Controller, obtenez les éléments de la liste et la valeur sélectionnée

public ActionResult Edit(int id)
{
    ItemsStore item = itemStoreRepository.FindById(id);
    ViewBag.CategoryId = new SelectList(categoryRepository.Query().Get(), 
                                        "Id", "Name",item.CategoryId);

    // ViewBag to pass values to View and SelectList
    //(get list of items,valuefield,textfield,selectedValue)

    return View(item);
}

et en vue

@Html.DropDownList("CategoryId",String.Empty)
Député de Praveen
la source
5
Ce n'est généralement pas un modèle divin d'exposer votre référentiel à la vue comme ceci.
André Pena
6

Pour lier des données dynamiques dans une DropDownList, vous pouvez effectuer les opérations suivantes:

Créez ViewBag dans Controller comme ci-dessous

ViewBag.ContribTypeOptions = yourFunctionValue();

utilisez maintenant cette valeur dans la vue comme ci-dessous:

@Html.DropDownListFor(m => m.ContribType, 
    new SelectList(@ViewBag.ContribTypeOptions, "ContribId", 
                   "Value", Model.ContribTypeOptions.First().ContribId), 
    "Select, please")
Dilip0165
la source
0
     @Html.DropDownListFor(m => m.SelectedValue,Your List,"ID","Values")

Ici, la valeur est cet objet du modèle où vous souhaitez enregistrer votre valeur sélectionnée

Abdul Aleem
la source