115 votes

Gestion de la validation ModelState dans l'API Web ASP.NET

Je me demandais comment je pouvais obtenir la validation de modèle avec l’API Web ASP.NET. J'ai mon modèle comme suit:

 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; }
}
 

J'ai ensuite une action Post dans mon contrôleur API:

 public void Post(Enquiry enquiry)
{
    enquiry.EnquiryDate = DateTime.Now;
    context.DaybookEnquiries.Add(enquiry);
    context.SaveChanges();
}
 

Comment puis-je ajouter if(ModelState.IsValid) puis gérer le message d'erreur pour le transmettre à l'utilisateur?

194voto

Cuong Le Points 29324

Pour séparer les préoccupations, je vous suggérerais d’utiliser un filtre d’action pour la validation du modèle. Vous n'avez donc pas à vous soucier beaucoup de la validation dans votre contrôleur api:

 using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace System.Web.Http.Filters
{
    public class ValidationActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var modelState = actionContext.ModelState;

            if (!modelState.IsValid)
                actionContext.Response = actionContext.Request
                     .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
    }
}
 

35voto

Are Almaas Points 170

Peut-être pas ce que vous cherchiez, mais peut-être bien que quelqu'un sache:

Si vous utilisez .net Web Api 2, vous pouvez simplement procéder comme suit:

 if (!ModelState.IsValid)
     return BadRequest(ModelState);
 

En fonction des erreurs de modèle, vous obtenez le résultat suivant:

 {
   Message: "The request is invalid."
   ModelState: {
       model.PropertyA: [
            "The PropertyA field is required."
       ],
       model.PropertyB: [
             "The PropertyB field is required."
       ]
   }
}
 

29voto

Anders Holmström Points 4422

Comme ceci, par exemple:

public HttpResponseMessage Post(Person person)
{
    if (ModelState.IsValid)
    {
        PersonDB.Add(person);
        return Request.CreateResponse(HttpStatusCode.Created, person);
    }
    else
    {
        // the code below should probably be refactored into a GetModelErrors
        // method on your BaseApiController or something like that

        var errors = new List<string>();
        foreach (var state in ModelState)
        {
            foreach (var error in state.Value.Errors)
            {
                errors.Add(error.ErrorMessage);
            }
        }
        return Request.CreateResponse(HttpStatusCode.Forbidden, errors);
    }
}

Ce sera le retour de ce type de réponse (en supposant que JSON, mais le même principe de base de XML):

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
(some headers removed here)

["A value is required.","The field First is required.","Some custom errorm essage."]

Bien sûr, vous pouvez construire votre erreur d'objet/de la liste de la manière que vous voulez, par exemple en ajoutant des noms de champ, le champ id etc.

Même si c'est un "one-way" appel Ajax comme un POST d'une nouvelle entité, vous devez toujours revenir à quelque chose de l'appelant - quelque chose qui indique si oui ou non la demande a été couronnée de succès. Imaginez un site où votre utilisateur d'ajouter un peu d'infos sur eux-mêmes via une requête AJAX requête POST. Que faire si les informations qu'ils ont essayé d'entré n'est pas valide - comment vont-ils savoir si leurs Économiser de l'action est réussie ou pas?

La meilleure façon de le faire est d'utiliser le Bon Vieux Codes d'État HTTP , comme 200 OK et ainsi de suite. De cette façon, votre JavaScript peuvent gérer correctement les défaillances à l'aide de la bonne rappels (erreur, succès, etc).

Voici un bon tutoriel sur une version plus avancée de cette méthode, à l'aide d'un ActionFilter et jQuery: http://asp.net/web-api/videos/getting-started/custom-validation

9voto

Lijo Points 4002

Suivant est à partir de la Validation du Modèle Par Mike Wasson

Dans ASP.NET l'API Web, vous pouvez utiliser les attributs du Système.ComponentModel.DataAnnotations espace de noms pour définir des règles de validation pour les propriétés de votre modèle.

L'API Web ne signifie pas automatiquement renvoie une erreur du client lors de la validation échoue. C'est à l'action du contrôleur pour vérifier le modèle de l'état et de réagir de façon appropriée.

Vous pouvez également créer une action de filtre pour vérifier le modèle de l'état avant l'action du contrôleur est invoquée.

Si le modèle de la validation échoue, ce filtre retourne une réponse HTTP qui contient les erreurs de validation.

Également consulter la vidéo ASP.NET l'API Web, Partie 5: Validation Personnalisée - Jon Galloway

Autres Références

  1. Prendre une Promenade sur le Côté Client WebAPI et WebForms
  2. Comment ASP.NET l'API Web lie HTTP messages à des modèles de domaine, et comment travailler avec des formats de média en Web API.
  3. Dominick Baier - Sécurisation ASP.NET Web Api
  4. Accrochage AngularJS validation de ASP.NET Web API de Validation
  5. L'affichage ModelState Erreurs avec AngularJS dans ASP.NET MVC
  6. Comment rendre les erreurs de client? AngularJS/WebApi ModelState
  7. La dépendance à injection de Validation dans l'API Web

1voto

Vous pouvez également lancer des exceptions comme indiqué ici: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

Remarque: pour faire ce que cet article suggère, n'oubliez pas d'inclure System.Net.Http

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X