2017-05-31 3 views
0

[Edit: les extraits de code d'origine ne sont pas correctes.]C# aide pour trouver mon message d'erreur de validation personnalisée de la propriété décorée avec RequiredAttribute

[Ce poste est onformément pour aider à répondre à la question précise que j'avais que j'ai trouvé un Réponds à. Je suis en train de lier mon exemple de post que j'ai suivi et ensuite le post qui m'a donné la réponse. Ensuite, je poste le code que j'ai utilisé avec succès pour produire les résultats que j'ai atteints.]

J'ai implémenté une technique simple de validation dans mon entrée dans un ApiController. Le code suivant était fonctionnel, mais comme vous pouvez le voir il a seulement fourni un message d'erreur générique.

La réponse que je trouve pour me guider à cette technique se trouve ici: https://stackoverflow.com/a/19322688/7637275

Voici mon code que j'ai commencé avec -

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

namespace TestValidation 
{ 
    internal class ValidateModelStateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      if (!actionContext.ModelState.IsValid) 
      { 
       throw new HttpException(422, "Validation failed on input"); 
      } 
     } 
    } 
} 

L'extrait suivant montre l'erreur de validation que je devais voir, au lieu du message générique noté ci-dessus.

[Required(ErrorMessage = @"Parameter ""ID"" is required.")] 
[MaxLength(18, ErrorMessage = @"Exceeded max length (18 characters) for parameter ""ID""")] 
public string ID { get; set; } 

A ce moment, dans mon remplacement, je dois creuser dans l'objet HttpActionContent « ActionContext » pour trouver les messages d'erreur personnalisés.

Répondre

0

[Edit:. Les extraits de code d'origine ne sont pas correctes]

J'ai trouvé une excellente réponse affichée qui m'a aidé à résoudre ma question! Le lien suivant vous amène à cette réponse: https://stackoverflow.com/a/33009722/7637275

Voici le code que j'ai utilisé pour fournir les messages de validation personnalisés de mon service Web. J'ai fait trois petits ajustements. J'ai choisi d'implémenter un bloc Try/Catch qui fournit simplement le message d'erreur générique si le code échoue. J'ai utilisé une liste au lieu d'un var (style de codage). J'ai également utilisé un point-virgule au lieu d'un saut de ligne pour joindre les erreurs (cela correspond à mon exigence).

Un grand merci aux deux affiches dans stackoverflow qui m'a aidé à aller au fond de tout ça!

using System.Web.Http; 
using System.Web.Routing; 
using System.Web.Http.Controllers; 
using System.Web; 
using System.Web.Http.Filters; 
using System.Linq; 
using System.Collections.Generic; 


namespace TestValidation 
{ 
    internal class ValidateModelStateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      if (!actionContext.ModelState.IsValid) 
      { 
       string errorMessage = string.Empty; 

       List<string> errors = new List<string>(); 

       try 
       { 
        errors = actionContext.ModelState.Values.SelectMany(val => val.Errors.Select(err => err.ErrorMessage)).ToList(); 

        errorMessage = string.Join(";", errors); 
       } 
       catch     { 
        errorMessage = "Validation failed on input"; 
       } 

       throw new HttpException(422, errorMessage); 
      } 
     } 
    } 
}