2011-04-21 31 views
152

Estoy revisando mi base de datos en Create(FooViewModel fvm){...} para ver si el fvm.prop1 y fvm.prop2 ya existen en esa combinación; si es así, quiero agregar un error al estado del modelo, luego devolver la vista completa. Probé:ModelState.AddModelError - ¿Cómo puedo agregar un error que no sea para una propiedad?

public ActionResult Create(FooViewModel fvm){ 
    if (ThatComboAlreadyExists(fvm)) { 
     ModelState.AddModelError("Model", "There is already one like that"); 
     return View(fvm); 
    } 
} 

... pero no consigo ninguna visualización de errores en el resumen de validación, que es donde supongo que aparecerían. Tengo la sospecha de que "Modelo" no es la clave correcta, pero no he podido encontrar nada como Google.

+0

http://stackoverflow.com/a/2819178/1193727 – resnyanskiy

Respuesta

267

finalmente yo nos topamos con an example del uso que estaba buscando - para asignar un error en el modelo, en general, en lugar de una de sus propiedades, como de costumbre de llamar:

ModelState.AddModelError(string key, string errorMessage); 

pero el uso de una cadena vacía para la clave:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo."); 

El mensaje de error se presentará en el <%: Html.ValidationSummary() %> como era de esperar.

+14

Este caso me hace pensar: ¿Por qué no hay un método como 'ModelState.AddError (errorMessage)' o 'ModelState.AddGlobalError (errorMessage)' ... sería intuitivo y más fácil averiguar cómo agregar un mensaje de error no relacionado con las propiedades de ningún modelo. –

+0

@Rubens: cierto, pero puede agregar fácilmente dicho método con los métodos de extensión. – Johnny5

+2

También puede mostrar el error con la tecla '@ Html.ValidationMessage (string.Empty)' –

23

Puede agregar el error de modelo en cualquier propiedad de su modelo. Sugiero que no haya nada relacionado con la creación de una nueva propiedad.

Como ejemplo, verificamos si el correo electrónico ya está en uso en DB y agregamos el error a la propiedad Correo electrónico en la acción, así que cuando devuelvo la vista, saben que hay un error y cómo mostrarlo usando

<%: Html.ValidationSummary(true)%> 
<%: Html.ValidationMessageFor(model => model.Email) %> 

y

ModelState.AddModelError("Email", Resources.EmailInUse); 
+1

Esto parece contrario a la intuición, en mi caso - Estoy comprobando para ver si una combinación particular de col1 y col2 ya existe en la base de datos, por lo que no parece correcto tener la propiedad IsDuplicateOfAnotherRow en mi ViewModel. Resulta que puede agregar un error a su modelo: vea mi respuesta. –

+0

¿Hay alguna manera de obtener la cadena "Correo electrónico" para AddModelError sin usar una cadena literal frágil? Me gusta '(m => m.email) .SomeMagicToString()'? – Snekse

+0

No lo creo, tienes que ir con la secuencia mágica ... no es la mejor, pero sigue siendo una buena solución – VinnyG

1

Poner la propiedad de punto modelo de cadenas trabajó para mí: ModelState.AddModelError("Item1.Month", "This is not a valid date");

+1

Eso de hecho mostraría un mes inválido en su UI, pero no resuelve el problema original. –

+2

El problema original proviene de no entender qué "clave" representa en el método. Esto arroja algo de luz sobre cómo funciona "clave", por lo que es bueno saber que la clave no tiene que ser solo un nombre de propiedad, sino que también puede referirse a propiedades anidadas o al valor especial String.Empty. – Triynko

Cuestiones relacionadas