2011-10-27 13 views
12

Sono nuovo di ASP.NET MVC 3.0 e cercando di costruire un'applicazione che utilizza la progettazione MVC ViewModel ..Best practice per MVC .. ViewModel rilegatura utilizzando interfacce Esempio

mi chiedevo controllori che cosa le migliori pratiche sono REINQUADRAMENTO per ViewModels e avere alcune domande qui sotto. Questa è la mia comprensione finora (che potrebbe essere sbagliato) ..

  • Creiamo Modelli.
  • Creare ViewModels creando nuovi attributi di classe e declairing con lo stesso nome e tipo delle classi del modello di base (compresi i campi ID dei modelli di base che si desidera aggiornare in un secondo momento .. e le classi non sono collegate in alcun modo).
  • Creare un repository per ciascuno dei modelli di base (per trovare e salvare dati ecc.).
  • Creare un'azione Controller per ciascuno dei ViewModels (che accede ai repository delle classi base per recuperare i valori e inserire questi valori nel ViewModel, quindi passare ViewModel alla ViewModels View).
  • creare viste dalle ViewModels (ViewModel Visualizzazioni)
  • Nella aggiornamento del controller ViewModel metodo (POST) ricevere l'oggetto ViewModel aggiornato e convertirlo in oggetti del modello di base (forse usare Automapper?) E accanto salvare gli oggetti del modello base posteriore usare i loro repository e applicare l'associazione come questa? "TryUpdate < 'IPerson> (persona)", "TryUpdate <' IPlace> (luogo);" (questo sembra sbagliato, l'obiettivo è di riportare i valori nelle classi base dal ViewModel, applicare il binding, salvare i modelli di base usando i repository! .. Questo sembra non utilizzare i repository .. Invece di TryUpdate < 'IPerson> (persona), mi aspetto di vedere qualcosa di simile: person.Save (IPerson) .. dove "persona contiene i valori", ".Save è il repository" e "IPerson contiene gli attributi di binding da utilizzare per l'associazione"? .. Non so se questo è giusto ..

Finora ho creato ViewModels facendo una nuova classe e l'aggiunta di attributi di diversi modelli base che utilizzano gli stessi nomi a questo punto ho le seguenti domande:.

Q1: Ogni ViewModel ha il proprio c ontroller e accedere a ciascuna delle classi di repository dei modelli di base per ottenere i suoi valori?

Q2: nel ViewModel si dovrebbe includere il campo ID di tutti i modelli di base da cui si stanno utilizzando gli attributi, considerando che si potrebbe voler POSTARE un aggiornamento attraverso il ViewModels Controller al repository dei modelli di base (che richiede il Valori ID)?

Q3: Come si collegheranno gli attributi utilizzando un'interfaccia per l'associazione del modello nel controller utilizzando il repository per il salvataggio.

sono stato in grado di trovare un tutorial o una risorsa che spiega tutto in un passo per esempio passo, una risposta completa sarebbe il seguente esempio:

  • 2x modelli semplici, 1x semplice ViewModel, interfaccia di 1x per binding, 1x controller semplice che utilizza una classe di interfaccia per il binding su update, 1x repository .. ie

// Model1

public class Person 
{ 
    int PersonID {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 
    DateTime DOB {get;set} 
} 

// Model2

public class Place 
{ 
    int PlaceID {get;set;} 
    string Description {get;set;} 
    string AreaType {get;set;} 
    string PostCode {get;set;} 
} 

// ViewModel (contenenti attributi da modelli)

publc class ViewModel 
{ 
    //Person attributes 
    int PersonID {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 

    //Place attributes 
    int PlaceID {get;set;} 
    string Description {get;set;} 
    string AreaType {get;set;} 

    //other attributes 
    string someOtherAttributeForDisplay {get;set} 
} 

// interfaccia Model1 (per vincolante modello)

public interface IPerson 
{ 
    string FirstName {get;set;} 
} 

// interfaccia Model2 (per il legame del modello)

public interface IPlace 
{ 
    string Description {get;set;} 
    string AreaType {get;set} 
} 

// ViewModelController?

{ 
    //What goes here? 
} 

// Deposito?

{ 
    //what goes here? 
} 
+0

stai usando Nuget? –

+0

Ciao Mitch, ho cercato di usare NuGet per aggiungere Unity ed EntLib ai miei progetti, non sono ancora abbastanza sicuro dei loro scopi ... – HonourCode

risposta

6

Penso che potresti aver complicato un concetto molto semplice.

Prima di tutto alcune regole generali:

  • Non utilizzare TryUpdateModel. Non farlo.
  • Per gli stessi motivi, non utilizzare alcun mapper di mappatura "automatico" per mappare da il modello di visualizzazione per le entità. La mappatura automatica al contrario (dall'entità al modello di vista) va bene.

L'utilizzo di interfacce non è necessario.

I modelli di vista dovrebbero essere classi molto semplici che contengono solo le informazioni necessarie per la visualizzazione. Se la tua vista trasmette informazioni POST diverse da quelle visualizzate, crea semplicemente un modello di visualizzazione diverso per POST.

Utilizziamo una convenzione di denominazione di {Controller} {Azione} Modello per i nostri modelli di vista. Quindi per un'azione chiamata "Elenco" su un controller "Post" avremo un modello chiamato "PostListModel".

Infine, prova anche la mia risposta qui Real example of TryUpdateModel, ASP .NET MVC 3

+0

Grazie per la tua risposta .. Sei consapevole che puoi associare i valori al Metodo TryUpdate includendo un'interfaccia seguita dal modello? cioè TryUpdate <'IPerson> (persona) Ho trovato alcune informazioni qui che ho seguito ma leggermente modificato nella mia versione per consentire alle proprietà di essere visualizzate nella vista e legate successivamente nel controller (questo è il concetto): http://codetunnel.com/blog/post/79/aspnet-mvc-model-binding-security .. pensi che questo ragazzo sia su qualcosa o fuori dal suo rocker? :) – HonourCode

+0

Mi sembra che l'utilizzo delle interfacce in questo modo sia solo per ovviare alle carenze dell'utilizzo di TryUpdateModel (per limitare le proprietà aggiornate), qualcosa che può essere ottenuto solo attraverso una semplice mappatura sinistra-destra. –

+0

Il vantaggio è supposta che puoi usare un automapper per mappare le proprietà in modo da poter ridurre il codice non dovendo fare il mapping left-right, ma puoi semplicemente passare gli oggetti attorno ..E se Fiddler cambia gli attributi allora non importa perché il binding non permetterà che i valori vengano salvati nel TryUpdate <'IModel> (modello) allo stesso modo del mapping left-right. Mi chiedevo, di quale controller avrebbe bisogno un ViewModel? .. È proprio o userebbe i controller della classe base? : S .. – HonourCode

Problemi correlati