2012-06-22 18 views
18

Tengo una clase auxiliar que se pasa una matriz de valores que luego se pasa a una nueva clase de mi modelo. ¿Cómo verifico que todos los valores dados a esta clase son válidos? En otras palabras, ¿cómo uso la funcionalidad de ModelState dentro de una clase sin controlador?Compruebe si el modelo es válido fuera del controlador

Desde el controlador:

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

Desde el ayudante:

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

} 

Respuesta

33

Usted podría utilizar la validación de datos de anotaciones fuera de un contexto 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

Desafortunadamente, esta validación no se repite a través de ningún objeto secundario o colecciones complejas. El Validator.TryValidateObject (...) solo hace validaciones de propiedad y campo inmediatas, y lo llama un día, en oposición a la validación que ocurre en el enlace del modelo en el controlador en el mundo MVC que atraviesa todo el gráfico del objeto. – neumann1990

1

Don' t use ModelState fuera de un controlador. No puedo ver lo que hace Monkey.RetrieveData() pero, en general, no pasaría a) datos simples de HTTPRequest yb) datos sin tipo como matrices de cadenas en su back-end. Deje que el marco web verifique los datos entrantes e instaure las clases mecanografiadas para usar en el back-end. Tenga en cuenta que la comprobación de inyección de HTML (secuencias de comandos XSS, etc.) debe realizarse manualmente si aplica sus datos manualmente.

En su lugar, utilice carpetas de modelo, etc. y pase datos tipados (por ejemplo, instancias de clases de clientes) a su servidor. Hay una publicación anterior de Scott Gu que muestra esto para MVC1: http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

En su ejemplo, permita que la vinculación modelo de MVC cree su cliente y aplique los valores de campo necesarios (consulte el enlace anterior sobre cómo funciona ese patrón). A continuación, le da su instancia de cliente a su backend donde se pueden hacer comprobaciones de validación adicionales en función de su instancia de cliente tipeada (por ejemplo, manualmente o con anotaciones de datos).

Cuestiones relacionadas