ASP.NET MVC Model vs ViewModel


92

OK, ho sentito parlare di "ViewModels" per quanto riguarda ASP.NET MVC di MS.

Ora, quello dovrebbe essere un tipo specifico di Modello, giusto? Non un tipo specifico di vista.

A quanto mi risulta, è una specie di Modello che ha uno scopo specifico di interagire con la Vista? O qualcosa di simile?

Qualche chiarimento sarebbe gradito.

Risposte:


71

Essenzialmente Model e View Model sono entrambe classi semplici con attributi.

L'obiettivo principale di queste classi è descrivere (per "modellare") un oggetto per i rispettivi pubblici che sono rispettivamente il controllore e la vista.

Quindi hai completamente ragione quando dici

A quanto mi risulta, è una specie di Modello che ha uno scopo specifico di interagire con la Vista

Pertanto, mentre le classi modello sono effettivamente entità di dominio con cui interagisce l'applicazione, i modelli di visualizzazione sono classi semplici con cui interagiscono le visualizzazioni.

Spero che sia d'aiuto :)

Aggiornamento :

Microsoft ha sviluppato una versione specializzata del modello di presentazione di Martin Fowler in gran parte basata su Model-View-Controller e l'ha chiamata Model-View-ViewModel (MVVM) per l'applicazione PF. Questo modello è destinato alle moderne piattaforme di sviluppo dell'interfaccia utente in cui gli sviluppatori dell'interfaccia utente hanno requisiti diversi basati più sulla logica di business rispetto agli sviluppatori tradizionali. Dai un'occhiata qui per un po 'di teoria


1
OK, grazie e anche grazie per l'aggiornamento, è molto utile! Quindi, senza tenere conto della versione speciale di MS, con MVC 2 di serie, metti i ViewModels in una cartella speciale e designata? O sono essenzialmente semplicemente inseriti nella cartella Models come qualsiasi altro. Oppure puoi fare entrambe le cose?
Qcom

Prego. Di solito metto i modelli e visualizzo i modelli nella stessa cartella perché voglio raggrupparli insieme rispetto al dominio a cui si riferiscono ma è solo una mia scelta e sono sicuro che ce ne sono di migliori
Lorenzo

5
ViewModel dovrebbe separare View dal (dominio) Model. Quindi ha senso mettere ViewModel vicino a View, non vicino a Model.
Vitaliy Ulantikov

Manterrei le mie classi 'Model' fuori dal mio progetto MVC piuttosto che in una cartella Model - terrei comunque le classi View Model all'interno del progetto MVC, in modo che, come dice Vitaliy, saranno vicine alla View.
Dan Harris,

@Lorenzo Sulla prima riga, dici "entrambe le classi semplici con attributi". Penso che intendi con proprietà? In caso negativo, a quali attributi ti riferivi? Attributi e proprietà
xr280xr

69

In termini più semplici, mi piace pensare a quanto segue:

Modello: sembra e si sente rigorosamente come il tuo modello di dati. A tutti gli effetti è solo una rappresentazione di classe del modello di dati. Non è a conoscenza della tua vista o di qualsiasi elemento all'interno della tua vista. Detto questo, non dovrebbe contenere alcun attributo decorator (ad esempio; Richiesto, Lunghezza, ecc.) Che useresti per la tua vista.

Visualizza modello: funge da legante di dati tra la vista e il modello e, in molti casi, è anche un wrapper per il modello. Sarebbe reso inutile senza la vista, quindi in genere non è riutilizzabile su più viste e controller come un modello standard.

Ad esempio, il tuo modello potrebbe avere le seguenti proprietà, che sono rappresentazioni dirette della tua origine dati:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Ora, poiché il tuo modello di visualizzazione è legato alla tua vista, potrebbe avere la seguente proprietà, che concatena il campo FirstName del modello e il campo LastName insieme come una stringa:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}

2
Potresti fornire un esempio più completo del ViewModel? Come fa a sapere cos'è myModel e come ottiene i dati per myModel?
M Kenyon II

5
Per natura, un ViewModel è un semplice oggetto C # (POCO) e non saprà mai veramente come appare il tuo modello di dati. È più un ibrido del tuo modello di dati e di elementi specifici che la tua visualizzazione deve mostrare. Per quanto riguarda il modo in cui ottiene i dati, devi caricarli con i dati. Mi piace usare una classe intermedia separata, in cui chiamo il mio servizio per i dati e quindi carico manualmente quei dati nel mio ViewModel. Quindi restituisco il ViewModel completamente caricato all'azione del controller.
Jason Marsell

26

Ho trovato questo articolo una risorsa molto utile per capire come interagiscono "Domain Model" e "View Model" all'interno di un'applicazione MVC, in particolare per quanto riguarda l'associazione. Meglio di tutti include esempi invece di descrizioni astratte.

"Da quando MVC è stato rilasciato, ho osservato molta confusione su come costruire al meglio i modelli di visualizzazione. A volte questa confusione non è priva di una buona ragione poiché non sembra esserci una tonnellata di informazioni là fuori sui consigli di best practice. Inoltre, non ci sono una soluzione "taglia unica" che funge da pallottola d'argento. In questo post descriverò alcuni dei principali modelli emersi e i pro / contro di ciascuno. È importante notare che molti di questi modelli sono emersi da persone che risolvono problemi del mondo reale ".

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


19

WikiPedia ha una descrizione più completa di Model vs. ModelView di quella che otterrai in una risposta SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Quoto:

Modello : come nel classico pattern MVC, il modello si riferisce a (a) un modello a oggetti che rappresenta il contenuto dello stato reale (un approccio orientato agli oggetti), o (b) il livello di accesso ai dati che rappresenta quel contenuto (un approccio centrico).

Vista : come nel classico pattern MVC, la vista si riferisce a tutti gli elementi visualizzati dalla GUI come pulsanti, finestre, grafici e altri controlli.

ViewModel : il ViewModel è un "modello della vista", il che significa che è un'astrazione della vista che serve anche nel collegamento dei dati tra la vista e il modello. Potrebbe essere visto come un aspetto specializzato di quello che sarebbe un controller (nel pattern MVC) che funge da legante / convertitore di dati che cambia le informazioni del modello in informazioni di visualizzazione e passa i comandi dalla visualizzazione al modello. ViewModel espone proprietà, comandi e astrazioni pubblici. Il ViewModel è stato paragonato a uno stato concettuale dei dati in contrapposizione allo stato reale dei dati nel modello.


3
Sebbene sia disponibile una descrizione di Model e ViewModel, tale collegamento descrive solo il modello architettonico MVVM. Non le differenze tra Model e View Models
Lorenzo

5

Esiste una nozione di ViewModel, ma generalmente non è associato ad Asp.net MVC. MVC usa lo schema del controller della vista modello, in cui il controller gestisce le interazioni, crea i dati dal modello e quindi passa i dati alla vista per la visualizzazione.

ViewModels (e il pattern Model View ViewModel) è più generalmente associato a Silverlight e WPF. Xaml è un po 'diverso in quanto le viste possono eseguire l'associazione bidirezionale ai ViewModels, quindi la tecnologia è leggermente diversa. Ad esempio, se si associa una casella di testo a un campo, mentre si digita in quella casella di testo, il valore del campo viene aggiornato dinamicamente. Questo tipo di interazione non è realmente possibile nelle pagine web poiché le pagine web sono apolidi.

La somiglianza tra i due modelli è che entrambi stanno cercando di separare la logica dal display. L'uso / motivo più comune per questo è il testing: vuoi essere in grado di eseguire dal codice (tramite un framework di testing) tutte le interazioni che un utente invocherà tramite l'interfaccia utente.


Nel libro che sto leggendo, "Professional ASP MVC 2", ViewModel è introdotto nel Capitolo 1 come mezzo per mantenere le interazioni presentazione / modello sia fortemente tipizzate che DRY. Gli autori di Microsoft includono Scott Hansleman, Phil Haack, Scott Guthrie.
Berryl

Ultimamente ho visto molto di più che ViewModel viene utilizzato in Asp.net MVC. sembrerebbe che il ViewModel abbia più affari nella vista rispetto al Domain Model. Quindi il modello che abbiamo utilizzato è che i modelli di dominio assemblino le parti principali del ViewModel. Attualmente, utilizziamo un modello di comando modificato (operazioni) che funziona con i modelli di dominio per eseguire le loro attività. I risultati vengono assemblati nel ViewModel e inviati alla visualizzazione. Il viewmodel in questo caso contiene tutte le annotazioni e la logica semplice e focalizzata che supportano la vista.
Sinaesthetic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.