Je me demandais comment réaliser la validation de modèle avec l'API Web ASP.NET. J'ai mon modèle comme ça:
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 alors une action Post dans mon contrôleur API:
public void Post(Enquiry enquiry)
{
enquiry.EnquiryDate = DateTime.Now;
context.DaybookEnquiries.Add(enquiry);
context.SaveChanges();
}
Comment ajouter if(ModelState.IsValid)
puis gérer le message d'erreur à transmettre à l'utilisateur?
c#
asp.net-web-api
CallumVass
la source
la source
System.Net.Http
,System.Net
System.Web.Http.Controllers
etSystem.Web.Http.Filters
.IncludeErrorDetailPolicy.Always
inclura le détail (au risque d'exposer des détails à vos utilisateurs)Peut-être pas ce que vous cherchiez, mais peut-être agréable à savoir:
Si vous utilisez .net Web Api 2, procédez comme suit:
En fonction des erreurs du modèle, vous obtenez ce résultat:
la source
Comme ceci, par exemple:
Cela renverra une réponse comme celle-ci (en supposant JSON, mais même principe de base pour XML):
Vous pouvez bien sûr construire votre objet / liste d'erreur comme vous le souhaitez, par exemple en ajoutant des noms de champ, des identifiants de champ, etc.
Même s'il s'agit d'un appel Ajax "à sens unique" comme un POST d'une nouvelle entité, vous devez quand même renvoyer quelque chose à l'appelant - quelque chose qui indique si la demande a réussi ou non. Imaginez un site où votre utilisateur ajoutera des informations sur lui-même via une requête AJAX POST. Que faire si les informations qu'ils ont essayé de saisir ne sont pas valides - comment sauront-ils si leur action Enregistrer a réussi ou non?
La meilleure façon de le faire est d'utiliser de bons vieux codes d'état HTTP comme
200 OK
et ainsi de suite. De cette façon, votre JavaScript peut gérer correctement les échecs en utilisant les bons rappels (erreur, succès, etc.).Voici un joli tutoriel sur une version plus avancée de cette méthode, utilisant un ActionFilter et jQuery: http://asp.net/web-api/videos/getting-started/custom-validation
la source
enquiry
objet, cela ne dit pas quelles propriétés sont invalides? Donc, si je laisseCustomerAccountNumber
vide, il devrait indiquer le message de validation par défaut (le champ CusomterAccountNumber est requis ..)errors.Add(error.ErrorMessage);
pourerrors.Add(error.Exception.Message);
obtenir ce travail pour moi.Vous pouvez utiliser des attributs de l'
System.ComponentModel.DataAnnotations
espace de noms pour définir des règles de validation. Référez-vous à la validation du modèle - Par Mike Wasson pour plus de détails.Voir également la vidéo API Web ASP.NET, Partie 5: Validation personnalisée - Jon Galloway
Autres références
la source
Ou, si vous recherchez une simple collection d'erreurs pour vos applications ... voici ma mise en œuvre de ceci:
La réponse au message d'erreur ressemblera à ceci:
la source
Ajouter le code ci-dessous dans le fichier startup.cs
la source
Ici, vous pouvez vérifier pour afficher l'erreur d'état du modèle une par une
}
la source
C #
...
Javascript
la source
J'ai eu un problème d'implémentation du modèle de solution accepté où mon
ModelStateFilter
retournait toujoursfalse
(et par la suite un 400)actionContext.ModelState.IsValid
pour certains objets de modèle:J'accepte uniquement JSON, j'ai donc implémenté une classe de classeur de modèle personnalisée:
Que j'inscris directement après mon modèle via
la source
Vous pouvez également lever des exceptions comme indiqué ici: http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx
Notez que pour faire ce que cet article suggère, n'oubliez pas d'inclure System.Net.Http
la source