2016-04-28 17 views
7

WebApi proje denetleyicimde yalnızca bir HttpGet yöntemi olan FluentValidation'ı başarıyla uygularım. Başka bir HttpGet yöntemi eklediğimde, her iki yönteme de rota özniteliği ekledim. yani [Rota ("Metot 1")] ve [Güzergah ("Metod2")].WebApi Kullanırken FluentValidation Çalışmıyor [Route] Öznitelik

Artık herhangi bir veri girip girmediğime bakmadan, ModelState doğru olarak geri dönüyor.

İşte kodum.

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

Kontrolör

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

Sen başvurulan makalesinde yapılan şeylerin çoğu var gibi

Custom Validation in ASP.NET Web API with FluentValidation

referans

için bu makaleyi kullanarak giriş Nesne

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

Denetleyiciyi hem iki yolla hem de gönderilen istek örneğini gösterin. – Nkosi

cevap

0

.

Yapılandırma siparişinizi kontrol edin.

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 otomatik ModelState içine hatalarını ekler. Bir hata mesajı eklemelisiniz.

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

makale Sorunuzun kapsamı dışındadır bazı içeriğine sahiptir. esas olarak cevapları sarar ama başka her şey sizin için çalışmalıdır.