2010-10-29 9 views
6

Mi chiedo se sia una buona idea o una cattiva idea, ponendo le cose come un elenco di paesi in ViewModel, per il collegamento a un elenco a discesa? Ad esempio sulla pagina di registrazione di un sito.best practice per ciò che è in un ViewModel

Ho avuto l'impressione che un ViewModel dovrebbe rappresentare un'istanza del modulo compilato, ma penso che potrei sbagliarmi visto che ho visto altre persone mettere cose come le liste nel loro ViewModel.

Non sarebbe meglio metterlo in una classe statica da qualche parte e chiamare direttamente dal View?

Come CommonData.ListCountries(); e quindi utilizzando Lambda per convertire nell'elenco di elementi SelectList nella vista Direttamente?

risposta

9

Come hai capito, ci sono una varietà di modi per raggiungere il tuo obiettivo. Mentre lo MVC design pattern incoraggia alcune organizzazioni applicative su come organizzare modelli, viste e controllori è in definitiva una questione di preferenza.

Scott Allen discute la sua preferenza per trattare con ASP.NET MVC drop down lists in un post sul blog. Scott usa un metodo di estensione per convertire una enumerabile di un tipo complesso in un IEnumerable<SelectListItem> sul suo modello. Descrive quindi che al momento del post ASP.NET MVC non restituirà il IEnumerable<SelectListItem> inviato alla vista, ma solo il valore selezionato dall'utente. Quindi suggerisce che l'utilizzo di due modelli può semplificare le cose.

Questa è una descrizione ragionevole di ciò che si riferisce a ViewModels e FormModels. Un ViewModel trasporta i dati di visualizzazione alla vista e un FormModel viene utilizzato per riportare i dati raccolti su un'azione del controllore. Per ulteriori informazioni:

  • ViewModels contengono dati che consentono di eseguire il rendering di viste. Organizzando i miei ViewModels in questo modo posso inserire tutte le informazioni necessarie per rendere una vista particolare in un modello associato. Questo mi impedisce di utilizzare ViewData per tutto ciò che non è veramente temporaneo.
  • FormModels vengono utilizzati per raccogliere l'input dell'utente. FormModels (quasi) non contiene mai riferimenti ad altri tipi complessi e sono costituiti da primitive, DateTimes e stringhe.

In entrambi i casi, ho una regola complessa per never reuse a model for a different view. L'allineamento dei modelli con le viste utilizzate per renderli semplifica la scrittura delle tue visualizzazioni. Non devi preoccuparti di cose come i metodi statici, perché i tuoi modelli dovrebbero portare dati alle loro viste associate in un formato che è facile per loro renderizzare. Strumenti come AutoMapper possono aiutare a "appiattire" oggetti di dominio in modelli per scopi di visualizzazione.

Per ulteriori checkout lettura: ASP.NET MVC terminology is tripping me up - why 'ViewModel'?

+0

Grazie per la spiegazione. Ma, se non sto usando AJAX qual è il modo più pulito di mostrare errori sul modulo e re-legare gli elenchi a discesa? Non riesco davvero a creare una nuova istanza del mio modello di visualizzazione perché contiene un modulo parzialmente riempito, ma devo ancora ricreare l'elenco dei paesi per tornare alla vista la seconda volta. – lahsrah

+0

lahsrah: ho creato il metodo .populate() per viewmodel e chiamo quel metodo dal controller e il suo menu a discesa solo riempimento, altre proprietà sono preservate dal modulo submit – Muflix

3

Qualunque sia il dato richiesto dal View, inseriscilo nel ViewModel.

Il modo in cui lo vedo, una volta che la vista sta attraversando il processo di rendering, dovrebbe avere tutte le informazioni necessarie dal modello a cui è vincolato.

Se si inizia a utilizzare i metodi di supporto, la vista sta "tornando al controller" in un certo senso. I metodi di estensione/supporto sono perfetti per la formattazione, ecc., ma non devono chiamare attraverso il modello.

Non dimenticare, hai anche ViewData (fondamentalmente HttpContext.Current.Items, vive per singola richiesta), che è un meccanismo di archiviazione leggero che può essere utilizzato per condividere i dati attraverso le viste parziali (ad esempio).

+0

ok, quindi come faccio a gestire il caso in cui vi siano errori di convalida in forma e il ViewModel deve essere passato di nuovo in azione originale per visualizzare il modulo parially pieno, ho avrebbe bisogno di recuperare l'Elenco di nuovo dal database. In che è una buona idea aggiungere un metodo Populate sul modello di visualizzazione per ri-popolare questi elenchi a discesa prima di riportarlo alla vista in modo da non compilare elenchi a discesa in due punti? – lahsrah

+2

No, non è una buona idea. ViewModel dovrebbe essere meccanismi di archiviazione semplici da conservare sui dati, non recuperarli. Non dovrebbe avere nient'altro che proprietà (in generale). Ricorda, questo non è Web Form. Non c'è ViewState, le tue richieste dovrebbero essere apolidi. Se dopo aver inviato il modulo hai ancora bisogno di alcuni dati, "vai a riprenderlo", e imposta il valore nel ViewModel. Gli errori di convalida devono essere gestiti dallo stato del modello. Date un'occhiata ad alcuni dei video/tutorial su www.asp.net/mvc – RPM1984

+0

Ancora meglio del recupero dei dati sta facendo i messaggi di modulo AJAX e lasciando che il client (ad es. Javascript) decida dove reindirizzare la pagina dopo un successo o un messaggio di errore viene restituito. – Ryan