2012-08-17 15 views

Respuesta

2
ModelState.AddModelError("Email", "the email is invalid"); 

Pero generalmente eso no es algo que deba hacer manualmente en su controlador, pero debe usar un validador. Por ejemplo, podría decorar esta propiedad de Correo electrónico con algún atributo de anotación de datos de validación o, si es como yo, use FluentValidation.NET => de esta manera no debería hacerse preguntas sobre claves, sino centrarse en la lógica de validación real.

+0

¿La clave siempre va a ser el nombre? Pensé que esto se había generado, ¿por lo que no siempre se garantizó que fuera el nombre del objeto? –

+0

Siempre será lo mismo. –

+0

Siempre es igual al nombre del campo. Solo tenga cuidado porque si cambia el nombre del campo (incluso usando ReSharper), no actualizará esta cadena porque solo coinciden por coincidencia. Afortunadamente, creo que usar una clave desconocida no tendrá ningún efecto adverso (como hacer que tu página arroje Excepciones), es el equivalente a usar 'null'. –

17

Se puede utilizar una extensión que hace lo mismo que los HtmlHelper, y que va a trabajar para las propiedades anidadas:

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel>(this ModelStateDictionary dictionary, Expression<Func<TModel, object>> expression, string errorMessage) 
    { 
    dictionary.AddModelError(ExpressionHelper.GetExpressionText(expression), errorMessage); 
    } 
} 

esta manera puede utilizar de esta manera:

ModelState.AddModelError<TModel>(i => i.Person.Name, "test"); 

equivalente a

ModelState.AddModelError("Person.Name", "test"); 

Generará el mismo Id que el HTML. En la fuente de MVC, hacen un poco de desinfección adicional, pero con nombres normales que no deberían ser un problema.

+2

Acabo de encontrar un error al usar esto. Si la propiedad es una estructura, la expresión se ve como Convertir (propiedad) porque la expresión devuelve un objeto. En ese caso, el texto de expresión se evalúa como una cadena vacía. Recomiendo cambiar la función en static static void AddModelError (este diccionario ModelStateDictionary, expresión > expresión, string errorMessage) y llamándolo como ModelState.AddModelError ((TModel i) => i. Person.Name, "prueba") – Sven

Cuestiones relacionadas