MVC3 DropDownListFor - ein einfaches Beispiel?

112

Ich habe Probleme mit DropDownListFormeiner MVC3-App. Ich konnte StackOverflow verwenden, um herauszufinden, wie sie in der Ansicht angezeigt werden können, aber jetzt weiß ich nicht, wie die Werte in den entsprechenden Eigenschaften des Ansichtsmodells erfasst werden sollen, wenn sie gesendet werden. Damit dies funktioniert, musste ich eine innere Klasse erstellen, die eine ID und eine Werteigenschaft hatte, und dann eine verwenden IEnumerable<Contrib>, um die DropDownListForParameteranforderungen zu erfüllen. Wie soll MVC FW nun den in dieser Dropdown-Liste ausgewählten Wert wieder der einfachen Zeichenfolgeeigenschaft in meinem Ansichtsmodell zuordnen?

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; }
}

In meiner Ansicht platziere ich das Dropdown-Menü wie folgt auf der Seite:

<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>

Wenn ich das Formular abschicke, ContribTypeist das (natürlich) null.

Was ist der richtige Weg, um dies zu tun?

Trey Carroll
quelle

Antworten:

166

Das solltest du so machen:

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

Wo:

m => m.ContribType

ist eine Eigenschaft, in der der Ergebniswert angegeben wird.

Sergey Gavruk
quelle
2
DANKE!!! Sergey, genau das habe ich seit vielen Stunden gesucht.
Trey Carroll
Danke :) für deine Antwort Gibt es eine Möglichkeit, "- Select--" von hier aus anzuzeigen? ?
kbvishnu
1
@VeeKeyBee, Sie können der Liste contribTypeOptionsbeispielsweise ein neues Element hinzufügen, das new Contrib {ContribId = -1, Value = "Please Select"}in der Dropdown-Liste angezeigt wird. Als Sie überprüfen können , ob ContribTypeist -1dies bedeutet, dass Benutzer einen Wert ausgewählt haben
Sergey Gavruk
9
Sie können dies tun:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
Sergey Gavruk
1
@ SergeyGavruk. Diese Antwort wurde bei einigen kürzlich gestellten Fragen als Betrug verwendet, verwirrt jedoch einige Benutzer aufgrund der Anweisung . Der letzte Parameter des Konstruktors "Liste auswählen" ist ein ausgewählter Wert. Der letzte Parameter wird von der Methode ignoriert (die intern einen eigenen erstellt SelectList). . Es ist der Wert der Eigenschaft ( ContribType), der bestimmt, was ausgewählt wird (so funktioniert die Modellbindung), und der Code sollte einfach sein. @Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")Können Sie bitte die Antwort bearbeiten, um sie zu korrigieren?
7

Ich denke, das wird helfen: In Controller erhalten Sie die Listenelemente und den ausgewählten Wert

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);
}

und in Ansicht

@Html.DropDownList("CategoryId",String.Empty)
Praveen MP
quelle
5
Es ist normalerweise kein göttliches Muster, Ihr Repository so der Ansicht auszusetzen.
André Pena
6

Zum Binden dynamischer Daten in eine DropDownList haben Sie folgende Möglichkeiten:

Erstellen Sie ViewBag in Controller wie unten

ViewBag.ContribTypeOptions = yourFunctionValue();

Verwenden Sie diesen Wert jetzt in der folgenden Ansicht:

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

Hier ist Wert das Objekt des Modells, in dem Sie Ihren ausgewählten Wert speichern möchten

Abdul Aleem
quelle