Diciamo che sto scrivendo un'applicazione web del blog usando il pattern MVC. Il layout tipico per la pagina principale dell'applicazione blog è - una sorta di indice di post nella parte principale, e a parte alcune parti aggiuntive, come la timeline, il pannello di navigazione dei tag, il pannello di sottoscrizione, ecc. Questi controlli appaiono anche su un singolo post vista, e potrebbe apparire su altre viste che ho.
La mia domanda è: come devo gestire questi pannelli da parte mia nei miei punti di vista e controller. Vedo tre approcci qui:
-
Crea una grande classe viewmodel che contenga tutte le informazioni richiesto per il rendering della vista (indice o singolo post). In quel caso potrei rendere questi pannelli a parte un punto di vista parziale, e chiamandoli dalla vista che si sta facendo passare una parte di quella grande ViewModel. Lo svantaggio è - avrò il codice di riempimento viewmodel diffuso tra i vari metodi di controllo, il che significa che il codice è duplicato. Il che è abbastanza brutto.
-
Crea un altro livello di rendering della vista. Dì, lo strato più in alto di il rendering restituisce parti alfine di rendering html o funzioni che quando chiamato emette un html. Lo strato sotto questa "combinazione" strato parziale "darebbe solo viste parziali per ogni pannello che voglio, includere il contenuto principale. Lo svantaggio qui - l'uso della memoria. La maggior parte dei framework moderni esegue il rendering di html direttamente sul flusso di output, ma in questo approccio le viste parziali verranno rese prima in oggetti stringa, il che comporta un sovraccarico della memoria.
- Usa qualcosa come "RenderAction" da asp.net mvc, che chiama a metodo del controller da una vista. Penso che questa sia la peggiore soluzione di 3 dato, perché elimina un approccio MVC.
La domanda non è legata a nessun quadro specifico, voglio capire il modo generale di fare cose del genere.
Aggiorna
Dopo aver dato una risposta, ho scoperto che il post non è chiaro. Quindi aggiornamento ragionevole qui:
Alla voce viewmodel capisco un oggetto che contiene tutti i dati necessari per eseguire il rendering di una vista particolare.
Tutti e tre gli approcci implicano la costruzione di viste parziali con il proprio modello di visualizzazione. Ad esempio (usando la sintassi C #):
class SinglePostViewModel {
string Text {get;set;}
string Title {get;set;}
string Slug {get;set;}
DateTime PublishedDate {get;set;}
...
}
class TagNavigationPanelViewModel {
string TagText {get;set;}
int PostsCount {get;set;}
}
class CalendarNavigationPanelViewModel {
DateTime YearAndMonth {get;set;}
int PostsCount {get;set;}
}
La mia domanda è: come combinare bene quelle viste parziali.