2012-12-08 8 views
30

Sono abbastanza nuovo per MVC4, EF5 e ASP.Net e non riesco a trovare una buona risposta da nessuna parte.ViewModels o ViewBag?

Fondamentalmente, tutto dovrebbe essere eseguito tramite il viewmodel o è corretto includere anche il viewbag?

Dire che ho un metodo che popola un elenco a discesa, e sto usando un viewmodel per rappresentare l'output per la vista.

sono io ok per utilizzare Viewbag.DropDown = PopulateDropdown(); o sarebbe meglio incorporare questo nel ViewModel, con la creazione di una struttura per contenere il List<SelectListItem> creato da PopulateDropdown();?

So quanto utile ViewBag è, ma devo ancora vedere una solida ragione per non usarlo? Se qualcuno potesse offrirmi qualche altra idea, sarebbe fantastico.

risposta

45

In sostanza, tutto ciò Dovrebbe essere fatto attraverso il ViewModel o è Ok di incorporare anche viewbag?

Tutto deve essere eseguito all'interno di un modello di visualizzazione. Questo è ciò che è un modello di vista. Una classe che si definisce in modo specifico per soddisfare i requisiti della propria vista. Non mescolare ViewBags con ViewModels. Non è più chiaro per la vista da dove proviene l'informazione. O utilizzare solo un modello di vista (approccio che raccomando) o utilizzare solo ViewBags. Ma non mescolare il 2.

Quindi nel tuo esempio particolare avresti una proprietà sul tuo modello di vista che è di tipo IENumerable<SelectListItem> e all'interno della tua vista userai la versione fortemente tipizzata dell'Html.DropDownListFor helper per legare al modello:

@Html.DropDownListFor(x => x.ProductId, Model.Products) 

Ovviamente quelli sono solo i miei 2 centesimi. Altre persone diranno che mescolare ViewModels e ViewBags va bene e io rispetto la loro opinione.

+0

Grazie, c'è qualche altro vantaggio di utilizzare ViewModels oltre ViewBag a parte l'astrazione che offre? – EverythingGeek

+10

Certo che c'è. Ottieni Intellisense e puoi utilizzare le versioni fortemente tipizzate degli helper Html all'interno delle tue visualizzazioni. Riceverai anche un codice di refactoring e non farai più affidamento su stringhe magiche. Inoltre, è chiaro dove le informazioni provengono da una determinata vista guardando solo il modello di vista a cui questa vista è fortemente tipizzata. Se stavi usando una combinazione di ViewModels e ViewBag, dovresti anche guardare l'azione del controller che sta impostando ViewBag. –

+0

Grazie per averlo chiarito :) – EverythingGeek

9

Preferisco ViewModels sulla ViewBag dove possibile. Crea viste fortemente tipizzate. Rende il tuo codice più pulito, meno fragile, meno soggetto a errori e di facile manutenzione.

ViewBags sono solo dizionari di oggetti dinamicamente tipizzati in modo da perdere:

  • momento della compilazione il controllo
  • La capacità di refactoring con fiducia (si perde il supporto degli strumenti) sostegno
  • IDE - come la possibilità di navigare a tutti gli usi
  • Intellisense

per i punti bonus che fanno largo uso del ViewBag non trova anche il punto di utilizzare il MVC pattern

Ho l'impressione ViewBags sono stati creati per risolvere un problema di edge-caso in asp.net e la gente li usa invece di creare visualizzare i modelli come originariamente previsti nella progettazione della piattaforma, a scapito del loro lavoro.


con grazie al https://stackoverflow.com/a/15568190/10245

+1

Continuo a vedere questa cosa sull'intelligenza. Non è un problema; semplicemente dichiari/converti nella vista e hai intellisense. Ammetto che non uso i viewmodels (probabilmente a causa della pigrizia) ma sembra che non ci sia fastidio usare un viewbag considerando che è facile ottenere intellisense per questo. –

+0

Non c'è intellisenza per il contenuto del viewbag, esiste per il modello di pagina. Se questo non è abbastanza, non posso davvero aiutarti. Ricordami di non lavorare mai su nessuno dei progetti a cui hai lavorato, a meno che non riesca a strappare tutti i caratteri deboli, quindi ho una speranza di mantenerlo. Se pensi che si tratti di "problemi" ti manca il punto. –

+1

Se lo si dichiara nella vista si ha intellisense nello stesso modo in cui si è fatto un viewmodel. Il tipo di viewbag è quello che è stato dato: tu sai quale oggetto gli hai assegnato così da rendere lo stesso oggetto nella vista. Se si dispone di un elenco di oggetti, ad esempio, si dichiara tale elenco nella vista nella parte superiore della pagina e si invia ad esso il viewbag. Posso fare un viewmodel o un viewbag: nessuno dei due è molto meglio guardare dell'altro. L'Intellisense non è mai un problema a meno che non si usi direttamente il viewbag sulla vista. –