2009-02-08 15 views
14

E cosa inserisci nella visualizzazione?Cosa inserire nel ViewModel

Un recente blog da Scott Hanselman sull'utilizzo di uno speciale legante modello per la prova più facile mi ha portato a riflettere su quanto segue: Cosa hai messo nel tuo Logic Controller costruzione del modello di vista, e ciò che dovrebbe essere messo nella vista? quello che fa è questo:

var viewModel = new DinnerFormViewModel { 
    Dinner = dinner, 
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country) 
}; 
return View(viewModel); 

Ora, io uso lo stesso modo di passare i dati al mio punto di vista, ma non sono sicuro di come si occupa con la proprietà Paesi. Si potrebbe discutere su entrambi i lati: L'elenco dei paesi nell'elenco SelectList prepara i dati per la vista, proprio come se si crea un DTO viewmodel per passare i dati. D'altra parte, in qualche modo sembra che tu stia manipolando in modo specifico i dati da utilizzare in un elenco a discesa, limitando il modo in cui la vista gestisce i dati dal controller. Ritengo che questa sia un'area un po 'grigia sulla separazione delle preoccupazioni tra la vista e il controller, e non posso davvero decidere quale strada seguire. Ci sono delle buone pratiche per questo?

PS: Per semplificare, assumiamo il contesto ASP.NET MVC predefinito, quindi in pratica il tuo progetto pronto per l'uso. Motore di visualizzazione predefinito e tutto quel jazz.

risposta

13

In MVC (almeno questa caratteristica), una delle responsabilità del controller è preparare i dati per la vista. Quindi penso che sia perfettamente accettabile preparare un modello specifico per il consumo delle visualizzazioni che implica che verrà utilizzato in un menu a discesa. In questo caso, il controllore semplifica la visualizzazione e in effetti impedisce al codice scomodo di essere trascinato nella vista. Inoltre, impedisce di avere quelle stringhe magiche nel ViewData come VieData ["Paesi"].

Quindi, per riassumere, anche se può sembrare che ci sia un'area grigia in termini di responsabilità, in definitiva questo è il compito del controller: interagire con la vista e trasformare il modello di dominio in altri modelli che sono più facili da consumare dalla vista.

+0

sì, penso che tu abbia ragione. Se ci fosse bisogno di un'altra rappresentazione della lista dei paesi nella vista, in pratica creeresti un'altra vista DTO per quello, giusto? –

+0

Probabilmente. Anche se forse la SelectList può essere rappresentata da un costrutto UI diverso come forse un elenco di caselle di controllo o qualcosa del genere. Forse un diverso metodo helper html potrebbe ancora usare una SelectList e produrre qualcos'altro. –

+0

+1 L'uso dei modelli di visualizzazione in questo modo rimuove ancora di più la logica dalla vista, che è sempre auspicabile. –

7

Alcuni suggeriscono che avere un unico modello di visualizzazione per visione è ideale (doppato Thunderdome Principle).