2016-04-28 9 views
7

Ho implementato correttamente FluentValidation nel mio controller di progetto WebApi con un solo metodo HttpGet. Quando ho aggiunto un altro metodo HttpGet, ho aggiunto l'attributo route a entrambi i metodi. Ad esempio [Route ("Method1")] e [Route ("Method2")].FluentValidation non funziona quando si utilizza l'attributo WebApi [Route]

Ora il ModelState viene restituito come vero indipendentemente dal fatto che io inserisca o meno qualsiasi dato.

Ecco il mio codice.

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>(); 
     ... 
} 

oggetto di ingresso

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

Mostra il controller con entrambi i percorsi e anche un esempio della richiesta inviata. – Nkosi

risposta

0

L'utilizzo di questo articolo per riferimento

Custom Validation in ASP.NET Web API with FluentValidation

Lei sembra avere la maggior parte di ciò che viene fatto in questo articolo si fa riferimento.

Controllare l'ordine di configurazione.

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 inserisce automaticamente gli errori nel ModelState. Dovresti includere un messaggio di errore.

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

L'articolo presenta alcuni contenuti che non rientrano nell'ambito della domanda. principalmente avvolgendo le risposte ma tutto il resto dovrebbe funzionare per voi.