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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist Ihre
DropDownList
Erklärung das ist falsch. Versuchen Sie dies:Aber wirklich, Sie sollten sich setzen, wählen Sie die Liste in Ihrem Modell:
Dann füllen Sie es in Ihrem controller:
Dann können Sie tun:
Danke für die änderung 🙂
Ausgezeichnet. Das hat geklappt. Ich habe das durchgezogen und verwendet Ihre stark typisierte Helfer, die, von dem, was Forty-Two sagt, ist ein besserer Weg, um mit Drop-Down-Listen. Ich glaube, ich verstehe den Prozess, der jetzt alles.
Dieser post wird
Model.Clubs
mit einemClubId
Wert gefüllt, aber ein null -Name
Wert, Nein?InformationsquelleAutor mattytommo
Vermeiden Sie die Verwendung von dynamischen Sachen wie ViewBag/ViewData zur übertragung von Daten von action-Methoden zu sichten. Wechseln Sie zu stark typisierte Ansatz.
Aktualisieren Sie Ihre Viewmodel zu haben, 2 mehr Eigenschaften. man halten Sie eine Sammlung von clubs und halten Sie den ausgewählten club.
Jetzt in Ihrer Aktion zu ERHALTEN, Bekommen die clubs und laden Sie es auf die
Clubs
Eigenschaft.vorausgesetzt
GetListOfSelectListItemFromClubsFromSomeWhere
ist eine Methode, die gibt eine Liste von SelectListItem für Ihre Vereineund in Ihrer Ansicht verwenden Sie das
Html.DropDownListFor
Helfer-MethodeWenn Sie dieses Formular gepostet wird, erhalten Sie die ausgewählten club-id in der
SelectedClub
Eigenschaft von Ihnen geposteten Modell.InformationsquelleAutor Shyju
Bitte sicher, dass Ihre Bearbeitung/creat action controller, das Grundstück ist korrekt gebunden:
InformationsquelleAutor Antonio Santise