2016-04-28 13 views
7

Ich habe erfolgreich FluentValidation in meinem WebApi-Projektcontroller implementiert, der nur eine HttpGet-Methode hatte. Als ich eine weitere HttpGet-Methode hinzufügte, fügte ich beiden Methoden ein Routenattribut hinzu. d.h. [Route ("Methode1")] und [Route ("Methode2")].FluentValidation funktioniert nicht bei Verwendung von WebApi [Route] Attribut

Jetzt kommt der ModelState als wahr zurück, unabhängig davon, ob ich irgendwelche Daten eingabe oder nicht.

Hier ist mein Code.

WebApiConfig

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 

     config.Filters.Add(new ValidateModelStateFilter()); 

     //FluentValidation 
     FluentValidationModelValidatorProvider.Configure(config); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{action}/{id}", 
      defaults: new { controller = "Menu", id = RouteParameter.Optional} 
     ); 


    } 
} 

ValidateModelStateFilter

public class ValidateModelStateFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.ModelState.IsValid) 
     { 
      actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); 
     } 
    } 
} 

-Controller

[HttpGet] 
[Route("Method1")] 
public IHttpActionResult ReadAllMenusByApplication([FromUri] ReadAllMenusByApplicationInput input) 
{ 
     var result = new List<ApplicationMenu>(); 
     ... 
} 

Eingangsobjekt

using FluentValidation; 
using FluentValidation.Attributes; 

namespace MenuService.Models 
{ 
[Validator(typeof(ReadAllMenusByApplicationInputValidator))] 
public class ReadAllMenusByApplicationInput 
{ 
    public ReadAllMenusByApplicationInput() { 
     this.ApplicationName = string.Empty; 
    } 

    /// <summary> 
    /// The MenuSystem name of the application 
    /// </summary> 
    public string ApplicationName { get; set; } 
} 

public class ReadAllMenusByApplicationInputValidator : AbstractValidator<ReadAllMenusByApplicationInput> 
{ 
    public ReadAllMenusByApplicationInputValidator() 
    { 
     RuleFor(x => x.ApplicationName).NotEmpty(); 
    } 
} 

}

+0

Zeigen Sie den Controller mit beiden Routen und auch ein Beispiel der Anfrage gesendet werden. – Nkosi

Antwort

0

Referenz für diesen Artikel verwenden

Custom Validation in ASP.NET Web API with FluentValidation

Sie scheinen haben die meisten von dem, was in dem zitierten Artikel erfolgt.

Überprüfen Sie Ihre Konfigurationsreihenfolge.

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     // Web API configuration and services 
     config.Filters.Add(new ValidateModelStateFilter()); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{action}/{id}", 
      defaults: new { controller = "Menu", id = RouteParameter.Optional} 
     ); 

     //FluentValidation 
     FluentValidationModelValidatorProvider.Configure(config);  
    } 
} 

FluentValidation fügt automatisch seine Fehler in den ModelState. Sie sollten eine Fehlermeldung hinzufügen.

public class ReadAllMenusByApplicationInputValidator : AbstractValidator<ReadAllMenusByApplicationInput> { 
    public ReadAllMenusByApplicationInputValidator() { 
     RuleFor(x => x.ApplicationName).NotEmpty() 
      .WithMessage("The Application Name cannot be blank."); 
    } 
} 

Der Artikel enthält einige Inhalte, die außerhalb des Bereichs Ihrer Frage liegen. hauptsächlich die Antworten zu verpacken, aber alles andere sollte für Sie arbeiten.