Me preguntaba cómo puedo lograr la validación del modelo con ASP.NET Web API. Tengo mi modelo así:
public class Enquiry
{
[Key]
public int EnquiryId { get; set; }
[Required]
public DateTime EnquiryDate { get; set; }
[Required]
public string CustomerAccountNumber { get; set; }
[Required]
public string ContactName { get; set; }
}
Luego tengo una acción Publicar en mi controlador API:
public void Post(Enquiry enquiry)
{
enquiry.EnquiryDate = DateTime.Now;
context.DaybookEnquiries.Add(enquiry);
context.SaveChanges();
}
¿Cómo agrego if(ModelState.IsValid)
y luego manejo el mensaje de error para transmitirlo al usuario?
c#
asp.net-web-api
CallumVass
fuente
fuente
System.Net.Http
,System.Net
System.Web.Http.Controllers
ySystem.Web.Http.Filters
.IncludeErrorDetailPolicy.Always
se incluirán los detalles (a riesgo de exponer los detalles a los usuarios)Quizás no sea lo que estabas buscando, pero quizás sea bueno que alguien lo sepa:
Si está utilizando .net Web Api 2, puede hacer lo siguiente:
Dependiendo de los errores del modelo, obtendrá este resultado:
fuente
Así, por ejemplo:
Esto devolverá una respuesta como esta (asumiendo JSON, pero el mismo principio básico para XML):
Por supuesto, puede construir su objeto / lista de error de la forma que desee, por ejemplo, agregando nombres de campo, ID de campo, etc.
Incluso si es una llamada Ajax "unidireccional" como un POST de una nueva entidad, aún debe devolver algo a la persona que llama, algo que indique si la solicitud fue exitosa o no. Imagine un sitio donde su usuario agregará información sobre sí mismo a través de una solicitud POST AJAX. ¿Qué pasa si la información que han intentado ingresar no es válida? ¿Cómo sabrán si su acción Guardar fue exitosa o no?
La mejor manera de hacerlo es usando códigos de estado HTTP buen viejo como
200 OK
y así sucesivamente. De esa manera, su JavaScript puede manejar correctamente las fallas utilizando las devoluciones de llamada correctas (error, éxito, etc.).Aquí hay un buen tutorial sobre una versión más avanzada de este método, usando ActionFilter y jQuery: http://asp.net/web-api/videos/getting-started/custom-validation
fuente
enquiry
objeto, pero no dice qué propiedades no son válidas. Entonces, si lo dejéCustomerAccountNumber
vacío, debería decir el mensaje de validación predeterminado (el campo CusomterAccountNumber es obligatorio ..)errors.Add(error.ErrorMessage);
paraerrors.Add(error.Exception.Message);
que esto funcionara para mí.Puede utilizar atributos del
System.ComponentModel.DataAnnotations
espacio de nombres para establecer reglas de validación. Consulte Validación del modelo: por Mike Wasson para obtener más detalles.Consulte también el video ASP.NET Web API, Parte 5: Validación personalizada - Jon Galloway
Otras referencias
fuente
O, si está buscando una colección simple de errores para sus aplicaciones ... aquí está mi implementación de esto:
La respuesta del mensaje de error se verá así:
fuente
Agregue el siguiente código en el archivo startup.cs
fuente
Aquí puede verificar para mostrar el error de estado del modelo uno por uno
}
fuente
C#
...
Javascript
fuente
Tuve un problema al implementar el patrón de solución aceptado donde mi
ModelStateFilter
siempre regresaríafalse
(y posteriormente un 400)actionContext.ModelState.IsValid
para ciertos objetos del modelo:Solo acepto JSON, así que implementé una clase de carpeta de modelos personalizada:
Que registro directamente después de mi modelo a través de
fuente
También puede lanzar excepciones como se documenta aquí: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
Tenga en cuenta que para hacer lo que sugiere ese artículo, recuerde incluir System.Net.Http
fuente