Quali sono i compromessi per l'utilizzo di "modelli a vista parziale"?

1

Mi sono reso conto di un prurito dovuto a un codice non DRY relativo alle classi del modello di visualizzazione in un'applicazione Web MVC (ASP.NET) e sto pensando di graffiare il mio prurito organizzando il codice in varie viste parziali model 'classes.

Con il modello a vista parziale, mi riferisco a una classe come una classe del modello di vista in un modo analogo al modo in cui le viste parziali sono come viste, ovvero un modo per incapsulare informazioni e comportamenti comuni.

Per rafforzare l '"analogia" e per aiutare a organizzare visivamente il codice nel mio IDE, stavo pensando di nominare le classi del modello della vista parziale con un prefisso _ , ad es. _ParentItemViewModel .

Come esempio un po 'più concreto del perché sto pensando in questa direzione, immagina di avere una classe% di dominio-classe ParentItem e il testo descrittivo user-friendly che identifica questi elementi per gli utenti è abbastanza complesso che Vorrei incapsulare quel codice in un metodo in una classe _ParentItemViewModel , per cui posso quindi includere un oggetto o una raccolta di oggetti di quella classe in tutte le classi del modello di vista per tutte le viste che devono includere un riferimento ad un articolo genitore, ad es ChildItemViewModel può avere una proprietà ParentItem del tipo di classe _ParentItemViewModel , in modo che nella mia visualizzazione ChildItemView , posso usare @Model.ParentItem.UserFriendlyDescription come desiderato, come breadcrumb, collegamenti, ecc.

Come secondo esempio, immagina di avere classi di entità SomeKindOfBatch , SomeKindOfBatchDetail e SomeKindOfBatchDetailEvent e una classe del modello di vista e almeno una vista per ciascuna di tali entità. Inoltre, l'applicazione di esempio copre molto più di alcuni tipi di batch , in modo che non sarebbe davvero utile o ragionevole includere informazioni su uno specifico tipo di batch in tutto delle classi del modello di visualizzazione del progetto. Ma, come nell'esempio sopra, ho del codice, per esempio per generare una stringa per identificare un qualche tipo di batch in un modo user-friendly, e mi piacerebbe poterlo usare in diverse viste, per esempio come testo breadcrumb o testo per un collegamento.

Come terzo esempio, descriverò un altro pattern che sto attualmente utilizzando. Ho una classe di entità Contact , ma è una classe fat , con dozzine di proprietà e almeno una dozzina di riferimenti ad altre classi fat . Tuttavia, un lotto di classi di modelli di viste ha bisogno di proprietà per fare riferimento a un contatto specifico e la maggior parte di esse ha bisogno di altre proprietà per le raccolte di contatti, ad es. possibili contatti a cui fare riferimento per un qualche tipo di relazione. La maggior parte di queste classi di modelli di visualizzazione richiede solo una piccola frazione di tutte le informazioni di contatto disponibili, in pratica solo un ID e una sorta di descrizione user-friendly (ad esempio un nome descrittivo). Sembra essere piuttosto utile avere una classe 'modello di vista parziale' per i contatti che possono essere utilizzati da tutte le altre classi di modelli di viste.

Forse sto solo fraintendendo 'view model class' - Capisco una classe del modello di vista come sempre corrispondente a una vista. Ma forse sto assumendo troppo.

    
posta Kenny Evitt 05.02.2014 - 19:23
fonte

1 risposta

1

Uso sempre i modelli di viste parziali quando la parte 'parziale' deve apparire uguale tra le diverse pagine. Ad esempio, se ho una lista di elementi che possono essere visualizzati nello stesso modo su più pagine, avrò un modello di vista parziale (es. '_ListOfWhatevers.cshtml') che può usare IList<Whatever> come tipo di modello su cui è basato. Quindi renderò quella vista parziale con l'elenco appropriato di elementi dalle mie viste di livello superiore. Finora non ho incontrato un punto in cui avrei voluto non averlo fatto. È molto utile con DRY quando ci sono molte pagine che mostrano lo stesso tipo di dati in contesti leggermente diversi.

    
risposta data 06.02.2014 - 17:56
fonte

Leggi altre domande sui tag