2010-02-02 8 views
16

Ecco la disposizione della terra. Come la maggior parte delle persone, ho il mio oggetto dominio e ho i miei modelli di vista. Mi piace l'idea di utilizzare i modelli di visualizzazione, in quanto consente di creare modelli specifici per un determinato contesto di visualizzazione, senza dover modificare i miei oggetti di business.La convalida di ASP.Net MVC 2 richiede un po 'più di riflessione in termini di schemi e utilizzo?

Il problema che ho è con la convalida di livello tipo definito sul mio oggetto dominio e ottenere tali norme per il cliente. In questo caso, diciamo che sto usando le annotazioni di dati per descrivere le regole di convalida, quando sposto i dati dall'oggetto dominio al modello di vista, il modello di vista non sa più quale validazione deve ottenere l'interfaccia per eseguire (perché la convalida è definito di nuovo sull'oggetto dominio).

Con MVC 2 si può ottenere per eseguire automaticamente validazione lato client/server, in base alle regole di convalida dell'oggetto corrente. Ma poiché le regole di convalida sono definite sull'oggetto dominio e non sul modello di visualizzazione, dovrei duplicare le regole di convalida sul modello di visualizzazione per farlo funzionare.

Come gli altri si occupano di questo tipo di problema? Il mio pensiero è che oltre a mappare i dati dall'oggetto dominio al modello di visualizzazione, dobbiamo anche mappare le regole di convalida, ma in realtà non ho visto gli altri parlare di questo problema ... Brad Wilson ha recentemente parlato di questo problema alla fine, ma non ha davvero affrontato la duplicazione delle regole sull'oggetto dominio e sui modelli di visualizzazione ... quali sono i tuoi pensieri?

Acclamazioni Anthony

+0

Questa è una duplicazione di: http://stackoverflow.com/questions/2075288/ –

risposta

3

Gli attributi DataAnnotation riguardano la convalida dell'input e il feedback dell'interfaccia utente all'utente finale. Questo è davvero il loro solo uso previsto. Io uso diverse strategie di validazione per gli oggetti dell'interfaccia utente e gli oggetti business, quindi gli attributi di convalida DA finiscono solo sui modelli mostrati all'utente.

+0

Hey, grazie per la risposta. Pertanto, puoi utilizzare l'abilità DataAnnotation e MVC per utilizzarla nel tuo modello di visualizzazione, per offrire all'utente un'esperienza ricca e utilizzare una strategia completamente diversa per i tuoi oggetti di business. Suppongo che se la validazione fallisce a livello di oggetti di business, hai un modo per reindirizzare i messaggi? Inoltre, come si fa mantenendo la regola di validazione in sincronia? Infine, che tipo di framework di validazione usi per gli oggetti di business? Penso che questo argomento sarebbe un ottimo post sul blog se tu avessi tempo ... congratulazioni su RC. – anthonyv

+1

Dipende da cosa è il messaggio, ma la maggior parte delle volte no, non sto comunicando i messaggi all'utente. L'unica volta che si finisce per dover ricondurre i messaggi commerciali all'utente è quando è l'unico posto in cui è possibile effettivamente validare qualcosa (ad esempio, univocità del database). –

+0

Grazie per il feedback. Ti incoraggerei davvero a fare un post sul blog su questo argomento perché so che ne trarrebbero davvero beneficio e sono sicuro che anche altri lo farebbero. È possibile presentare gli stessi esempi in cui vengono convalidati i VM e gli oggetti aziendali e in che modo tutto ciò avviene. Grazie ancora. – anthonyv

2

Questo potrebbe non essere appropriato, ma cosa succede se si appena spostato le regole di validazione/annotazioni dai modelli ai tuoi ViewModels? In alcuni dei progetti in cui sono stato, abbiamo scelto di impedire alla View di accedere a qualsiasi cosa che non fosse l'informazione esposta attraverso il corrispondente ViewModel. Dal momento che tutta l'interazione dei dati verrebbe eseguita tramite ViewModel, non sarebbe necessario avere la convalida sugli oggetti del modello.

Il contatore di questo argomento è che è possibile duplicare facilmente determinate regole di convalida, dal momento che diversi ViewModel potrebbero interfacciarsi con gli stessi Modelli. In questo caso, potrebbe essere opportuno dichiarare semplicemente il modello come una proprietà esposta sul ViewModel. Per i postback, potevano accettare un modello come parametro, consentendo all'infrastruttura ModelBinder di gestire la richiesta. In questo caso, se ModelState.IsValid è falso, puoi semplicemente riassegnare la proprietà a ViewModel prima di rivisualizzare la vista.

lo consiglio muovere le annotazioni ai tuoi ViewModel. Ha senso dal momento che molte viste sono a) il risultato della composizione di diversi modelli o b) un sottoinsieme di dati del modello.

0

Probabilmente non dovremmo usare visualizzare i modelli a tutti? E definire le regole di convalida sulle entità del livello del modello.

0

Ho preso in considerazione anche questo per un po 'di tempo. Capisco perfettamente la risposta di Brad. Tuttavia, supponiamo di voler utilizzare un altro framework di validazione adatto per l'annotazione di entità di dominio e modelli di visualizzazione.

L'unica soluzione che riesco a trovare su carta che funzioni ancora con gli attributi sarebbe quella di creare un altro attributo che "punti" alla proprietà di un'entità di dominio che si sta specchiando nel proprio modello di vista.Ecco un esempio:

// In UI as a view model. 
public class UserRegistration { 
    [ValidationDependency<Person>(x => x.FirstName)] 
    public string FirstName { get; set; } 

    [ValidationDependency<Person>(x => x.LastName)] 
    public string LastName { get; set; } 

    [ValidationDependency<Membership>(x => x.Username)] 
    public string Username { get; set; } 

    [ValidationDependency<Membership>(x => x.Password)] 
    public string Password { get; set; } 
} 

Un quadro come xVal potrebbe essere esteso per gestire questo nuovo attributo ed eseguire la convalida gli attributi della proprietà di classe di dipendenza, ma con il valore della proprietà la visualizzazione del modello. Non ho avuto il tempo di approfondire questo aspetto.

Qualche idea?

+1

Almeno con la soluzione proposta, ti imbatterai in problemi con il non essere in grado di inserire le istruzioni Lambda negli attributi. È una sfortunata restrizione. –

+0

Mi è piaciuta l'idea ma Chris ha sottolineato che questo potrebbe non funzionare ... Penso che ci sia bisogno di un modo per "port" attraverso non solo le definizioni di validazione ma i metadati in generale ... ma io non sono sicuro come questo si adatterebbe in modo uniforme ... – anthonyv

+0

Oooh. Punti buoni. Questo è il motivo per cui dovrei fare un test rapido prima di postare alcune volte. Naturalmente, un'altra opzione sarebbe quella di rinunciare alle annotazioni degli attributi per la convalida e utilizzare un motore di regole che consente di assegnare una regola (facendo riferimento a un'istanza o un nome da un elenco) a una o più proprietà. Forse l'assegnazione potrebbe essere fatta tramite attributi. [ValidateWithRule ("Obbligatorio"), ValidateWithRule ("MaxNameLength")] public string FirstName {get; impostato; } – ventaur

Problemi correlati