MVC 3: DropDownList auf ein Edit-Formular für ein Objekt, das eine Eigenschaft eines ViewModel

Überblick:
Ich versuche, ein ViewModel, das eine Eigenschaft aufweist, ist die model-Klasse, die ich versuche zu Bearbeiten. Ich habe gesehen das edit-Formular arbeiten mit dem MVC-Gerüst Bearbeiten von Formularen bei der Bearbeitung eines Modells direkt, aber ich bin versucht, eine ViewModel enthält das Modell bearbeitet wird. Alles funktioniert, außer für die Einsparung von einem Feld, das angezeigt wird, in eine DropDownList.

Erklärung:
Ich habe versucht auf das Gerüst features von MVC 3 zum erstellen eines edit-Formular für ein Modell.
In den MVC Music Store tutorial, dies ist für die Edit-Seite eines Album im StoreManagerController.
Innerhalb dieser Seite, haben Sie zwei drop-downs für Genre und Künstler. Jeder sieht ähnlich aus wie diese in der Ansicht:-

<div class="editor-label">
    @Html.LabelFor(model => model.GenreId, "Genre")
</div>
<div class="editor-field">
    @Html.DropDownList("GenreId", String.Empty)
    @Html.ValidationMessageFor(model => model.GenreId)
</div>

Soweit ich sagen kann, diese haben Ihre Optionen ausgefüllt, die in den controller mit der ViewBag.

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);

Arbeit mit dem Modell direkt

In meinem code habe ich es geschafft, das gleiche zu tun mit einem Objekt, das gespeichert wird die Datenbank über Entity Framework.

Modell

public class Season
{
    public int SeasonId { get; set; }
    public int ClubId { get; set; }
    public Club Club { get; set; }
}

Code im Controller

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", season.ClubId);

Ansicht

<div class="editor-label">
    @Html.LabelFor(model => model.ClubId, "Club")
</div>
<div class="editor-field">
    @Html.DropDownList("ClubId", String.Empty)
    @Html.ValidationMessageFor(model => model.ClubId)
</div>

Diese funktioniert einwandfrei.

Arbeiten mit den View-Modell

Aber jetzt habe ich gemerkt, dass die Seite braucht mehr text angezeigt, als das, was in dem Modell, das ich bin zu Bearbeiten.
Ich hatte gehofft, um einen speziellen View-Modell, mit dem bearbeiteten Modell (Saison) und den zusätzlichen text, den ich angezeigt haben wollen.

ViewModel

public class EditSeasonViewModel
{
    public string PlayerName {get; set;}
    public string SummaryText {get; set;}
    public int PlayerId {get; set;}
    public Season season {get; set;}
}

Ich dies Tat, änderte sich die controller haben die HttpGet und HttpPost-Methode verwendet die neue ViewModel, änderte sich die Ansicht zu akzeptieren, die neue ViewModel, und das all verändert '"EditorFor "" Methoden in der Ansicht zu verwenden-Modell.Saison.MyProperty.

Code im Controller

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", seasonVM.season.ClubId);

Code in Anzeigen

<div class="editor-label">
    @Html.LabelFor(model => model.season.ClubId, "Club")
</div>
<div class="editor-field">
    @Html.DropDownList("ClubId", String.Empty)
    @Html.ValidationMessageFor(model => model.season.ClubId)
</div>

Beim Debuggen der HttpPost-Methode, sind alle Werte für die Saison ordnungsgemäß vorhanden ist, außer für die ClubId Wert, die sollte von der DropDropList.

Habe ich nicht geändert, das DropDownList-in der Ansicht von der Art, wie es war, als waren wir mit dem Modell direkt.

Frage:
Meine Frage ist, was muss ich ändern, um die ClubId werden richtig gespeichert, wenn die Nutzung dieser neuen EditSeasonViewModel?

Auch, wie der ViewBag.ClubId in der HttpGet Methode im controller entspricht dem DropDownList-in der Ansicht, und dann haben Sie den Wert zurück an die HttpPost-Methode?

InformationsquelleAutor Sean Holmesby | 2013-03-20

Schreibe einen Kommentar