Panoramica: Sto cercando di utilizzare un ViewModel che ha una proprietà che è la classe modello che sto cercando di modificare . Ho visto che il modulo di modifica funziona utilizzando i moduli di modifica dello scaffold MVC quando si modifica un modello direttamente, tuttavia sto cercando di utilizzare un ViewModel che contiene il modello che si sta modificando. Tutto funziona tranne per il salvataggio di un campo che viene visualizzato in DropDownList.MVC 3: DropDownList su Modifica forma per un oggetto che è una proprietà di un ViewModel
Spiegazione: ho tentato di utilizzare le funzionalità di ponteggi MVC 3 per creare un modulo di modifica per un modello. Nel tutorial di MVC Music Store, questo viene fatto per la pagina Modifica di un Album
, nel StoreManagerController
. All'interno di quella pagina, hanno due menu a discesa per Genere e Artista. Ogni aspetto simile a questo nella vista: -
<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>
Per quanto posso dire, questi hanno le loro opzioni compilati nel controller utilizzando il ViewBag.
ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
Lavorare con il modello direttamente
Nel mio codice, sono riuscito a fare lo stesso con un oggetto che viene salvato nel DB tramite Entity Framework.
Modello
public class Season
{
public int SeasonId { get; set; }
public int ClubId { get; set; }
public Club Club { get; set; }
}
codice nel controller
ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", season.ClubId);
View
<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>
Questo funziona bene.
Lavorare con la vista del modello
Comunque ora mi sono reso conto che la pagina ha bisogno di più il testo visualizzato di quello che è disponibile nel modello sono la modifica. Speravo di creare un modello di vista speciale, con il modello modificato (stagione) e il testo in più che voglio visualizzare.
ViewModel
public class EditSeasonViewModel
{
public string PlayerName {get; set;}
public string SummaryText {get; set;}
public int PlayerId {get; set;}
public Season season {get; set;}
}
ho fatto questo, ha cambiato il controllore di avere metodi HttpGet e HttpPost utilizzare il nuovo ViewModel, cambiato la vista ad accettare il nuovo ViewModel, e ha cambiato i metodi 'EditorFor' tutti nella visualizzare per utilizzare model.season.MyProperty.
codice nel controller
ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", seasonVM.season.ClubId);
Codice in vista
<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>
Quando il debug del metodo HttpPost, tutti i valori per la stagione correttamente esistono, ad eccezione del valore ClubId che dovrebbe venire dalla DropDropList .
Non ho cambiato affatto DropDownList nella vista dal modo in cui era quando stavamo usando direttamente il modello.
Domanda: La mia domanda è, che cosa devo cambiare per ottenere il ClubId da salvare correttamente quando si utilizza questo nuovo EditSeasonViewModel
?
Inoltre, in che modo ViewBag.ClubId nel metodo HttpGet nel controller corrisponde a DropDownList nella vista e quindi è stato restituito il valore al metodo HttpPost?
+1 per usare l'helper fortemente tipizzato. La maggior parte delle domande dell'elenco a discesa in [tag: asp.net-mvc] sono il risultato di essere aggrovigliati in ViewBag, aiutanti debolmente tipizzati e problemi di associazione dei modelli. –
@SeanHolmesby Grazie per la modifica :) – mattytommo
@mattytommo - Eccellente. Ha funzionato. Sono andato avanti e ho usato il tuo helper fortemente tipizzato, che, da quello che dice Quarantadue, è un modo migliore per gestire gli elenchi a discesa. Penso di aver capito il processo di tutto adesso. –