2012-02-20 15 views
20

Nel mio controller ho una classe ProductInfo dal mio Domain Model e ho bisogno alcune delle sue informazioni per popolare il mio View ModelloProductStatsVM.come popolare un ViewModel in ASP.NET MVC3

Come si popola il modello di vista? Ho sentito tre possibili modi:

  1. popolano la vista del modello direttamente dal controller (non va bene, voglio mantenere il mio controller slim)
  2. Utilizzando un costruttore View Modello e superare il modello di dominio come parametro. (Devo creare un costruttore per ogni classe di modello di dominio che voglio usare)
  3. Utilizzando un metodo Fill(). (L'ho visto sul web, non ho idea di come funzioni Immagino che in questo modo il ViewModel debba conoscere il Service Layer e creare l'accoppiamento).

So che ci sono strumenti come automapper, che ho intenzione di usare davvero, ma prima voglio capire la logica su come compilare una vista del modello dal controller senza utilizzare alcun attrezzo.

+0

sembra che tu abbia risposto alla tua domanda lì. – dice

+1

Contento che l'abbiate chiesto, sono sorpreso che nessuno abbia fatto +1 su questa domanda come se lo avessero fatto il giorno dopo. Ho giocato con vari suggerimenti e proposte, ma la risposta di Darins è sulla mia strada, bella domanda, ottima risposta. – LenPopLilly

risposta

27

L'idea è che l'azione del controller interroghi alcuni repository per recuperare un modello di dominio. Poi si passa questo modello di dominio a un livello di mappatura che è responsabile per convertirlo in un modello di vista e alla fine passa il modello di vista alla vista:

public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    ProductViewModel viewModel = Mapper.Map<ProductInfo, ProductViewModel>(product); 
    return View(viewModel); 
} 

e si potrebbe anche fare il controller più sottile con l'introduzione di una consuetudine Filtro azione che intercetterà automaticamente il modello in caso OnActionExecuted e chiamare nello strato di mappatura di sostituirlo con il modello corrispondente vista in modo che la vostra azione di controllo diventa ora:

[AutoMapTo(typeof(ProductViewModel))] 
public ActionResult Index(int id) 
{ 
    ProductInfo product = repository.GetProductInfo(id); 
    return View(product); 
} 

e, naturalmente, ora la vista è fortemente tipizzato a ProductViewModel:

@model ProductViewModel 
... 

Fino a voi per implementare il metodo Mapper.Map<TSource, TDest>. E se non vuoi implementarlo da solo, puoi scaricare AutoMapper che ha già questo metodo per te.

Il livello di mappatura è qualcosa che fa parte dell'applicazione MVC. Deve essere a conoscenza sia dei modelli di dominio provenienti dal proprio livello di servizio sia dei modelli di vista definiti nell'applicazione MVC per poter eseguire la mappatura.

Non utilizzare i costruttori (diversi da quello senza parametri predefinito) nei modelli di visualizzazione. Il raccoglitore modello predefinito verrà soffocato se il modello di vista non ha un costruttore senza parametri nelle azioni POST e sarà necessario implementare i raccoglitori modello personalizzati.

+0

Incredibilmente chiaro e completo come sempre. Grazie molto! – CiccioMiami

+0

Risposta davvero interessante :) –

+0

A proposito, dove si configura la mappatura (ad esempio Mapper.CreateMap () ...)? – Abe

1

Poiché i viewmodels sono necessari per popolare l'interfaccia utente, dovrebbe essere una buona idea farli populare tramite i controller. Puoi comunque mantenerli snelli usando Automapper.

Problemi correlati