2011-03-06 20 views
43

Tengo esta función en mi controlador.¿Recibe el mensaje de error si falla ModelState.IsValid?

[HttpPost] 
public ActionResult Edit(EmployeesViewModel viewModel) 
{ 
    Employee employee = GetEmployee(viewModel.EmployeeId); 
    TryUpdateModel(employee); 

    if (ModelState.IsValid) 
    { 
     SaveEmployee(employee); 
     TempData["message"] = "Employee has been saved."; 
     return RedirectToAction("Details", new { id = employee.EmployeeID }); 
    } 

    return View(viewModel); // validation error, so redisplay same view 
} 

Mantiene su defecto, ModelState.IsValid sigue volviendo falso y volver a mostrar la vista. Pero no tengo idea de cuál es el error.

¿Hay alguna manera de obtener el error y volver a mostrarlo al usuario?

Respuesta

24

Puede hacer esto en su vista sin hacer nada especial en su acción usando Html.ValidationSummary() para mostrar todos los mensajes de error, o Html.ValidationMessageFor() para mostrar un mensaje para una propiedad específica del modelo.

Si todavía necesita ver los errores desde dentro de su acción o controlador, consulte la propiedad ModelState.Errors

+1

No hay propiedad ModelState.Errors ?! – niico

+0

@niico Creo que se refiere a la propiedad del tipo 'ModelState ', mientras que la propiedad Controller.ModelState es del tipo ModelStateDictionary. – devlord

0

tengo ni idea de si este es su problema, pero si se agrega un usuario y luego cambiar el nombre de su aplicación, ese usuario permanecerá en la base de datos (por supuesto), pero no será válido (que es el comportamiento correcto). Sin embargo, no se agregará ningún error para este tipo de falla. La lista de errores está vacía, pero ModelState.IsValid devolverá false para el inicio de sesión.

86

probar este

if (ModelState.IsValid) 
{ 
    //go on as normal 
} 
else 
{ 
    var errors = ModelState.Select(x => x.Value.Errors) 
          .Where(y=>y.Count>0) 
          .ToList(); 
} 

errores será una lista de todos los errores.

+1

respuesta perfecta. ¡Muchas gracias! –

45

Si usted está buscando para generar una cadena de mensaje único error que contiene los mensajes de error ModelState puede utilizar SelectMany para aplanar los errores en una sola lista:

if (!ModelState.IsValid) 
{ 
    var message = string.Join(" | ", ModelState.Values 
     .SelectMany(v => v.Errors) 
     .Select(e => e.ErrorMessage)); 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 
+7

A veces el 'ErrorMessage' no se proporciona, p. si un campo requerido 'DateTime' no está configurado. En este caso, busque el mensaje de excepción, p. 'e.Exception.Message'. – WhatIsHeDoing

1

Si modal Estado no es válido el & error no se puede ver en la pantalla porque su control está en acordeón colapsado, entonces puede devolver el HttpStatusCode para que se muestre el mensaje de error real si lo hace F12. También puede registrar este error en el registro de errores de ELMAH. Debajo está el código

if (!ModelState.IsValid) 
{ 
       var message = string.Join(" | ", ModelState.Values 
              .SelectMany(v => v.Errors) 
              .Select(e => e.ErrorMessage)); 

       //Log This exception to ELMAH: 
       Exception exception = new Exception(message.ToString()); 
       Elmah.ErrorSignal.FromCurrentContext().Raise(exception); 

       //Return Status Code: 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 

Pero tenga en cuenta que este código registrará todos los errores de validación. Entonces, esto debería usarse solo cuando surja una situación en la que no pueda ver los errores en la pantalla.

0

Comprobar Ok y añade al reloj:

  1. Hacer un punto de ruptura en la línea de ModelState en su Código
  2. Añadir su estado modelo para su reloj
  3. Expandir ModelState "Valores"
  4. Expandir Valores "Vista de resultados"

Ahora puede ver una lista de todas las Subclaves con su estado de validación al final del valor.

Busque el Valor no válido.

Cuestiones relacionadas