2012-06-22 12 views
18

Ho una classe helper che passa una matrice di valori che viene quindi passata a una nuova classe dal mio modello. Come posso verificare che tutti i valori dati a questa classe siano validi? In altre parole, come utilizzare la funzionalità di ModelState in una classe non controller.Verificare se il modello è valido all'esterno del controller

Dal controller:

public ActionResult PassData() 
{ 
    Customer customer = new Customer(); 
    string[] data = Monkey.RetrieveData(); 
    bool isvalid = ModelHelper.CreateCustomer(data, out customer); 
} 

Dal aiutante:

public bool CreateCustomer(string[] data) 
{ 
    Customter outCustomer = new Customer(); 
    //put the data in the outCustomer var 
    //??? Check that it's valid 

} 

risposta

33

Si potrebbe utilizzare la convalida le annotazioni di dati al di fuori di un contesto ASP.NET:

public bool CreateCustomer(string[] data, out Customer customer) 
{ 
    customer = new Customer(); 
    // put the data in the customer var 

    var context = new ValidationContext(customer, serviceProvider: null, items: null); 
    var results = new List<ValidationResult>(); 

    return Validator.TryValidateObject(customer, context, results, true); 
} 
+0

Sfortunatamente, questa convalida non viene inoltrata attraverso oggetti o raccolte figlio complessi. Validator.TryValidateObject (...) esegue solo convalide di proprietà e campi immediate e le chiama un giorno, a differenza della convalida che avviene sul binding del modello nel controller nel mondo MVC che attraversa l'intero grafico dell'oggetto. – neumann1990

1

Don' t utilizzare ModelState all'esterno di un controller. Non riesco a vedere cosa fa Monkey.RetrieveData() ma in generale non passerei a) dati semplici da HTTPRequest e b) dati non tipizzati come array di stringhe al tuo back-end. Lascia che il web-framework controlli i dati in entrata e instanziate le classi digitate da usare nel back-end. Si noti che il controllo dell'iniezione HTML (scripting XSS, ecc.) Deve essere eseguito manualmente se si applicano i dati manualmente.

Utilizzare invece i model-binders ecc. E passare i dati digitati (ad esempio istanze di classe Customer) al proprio back-end. C'è un post più vecchio di Scott Gu che mostra questo per MVC1: http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

Nell'esempio, l'associazione modello di MVC crea il cliente e applica i valori di campo richiesti (vedere il link sopra come funziona quel modello). Dopodiché fornisci l'istanza del cliente al tuo back-end, dove possono essere eseguiti ulteriori controlli di convalida in base all'istanza cliente digitata (ad esempio manualmente o con annotazioni di dati).

Problemi correlati