2016-04-28 22 views
7

Tôi đã triển khai thành công FluentValidation trong bộ điều khiển dự án WebApi của mình chỉ có một phương thức HttpGet. Khi tôi thêm một phương thức HttpGet khác, tôi đã thêm thuộc tính route cho cả hai phương thức. tức là [Route ("Method1")] và [Route ("Method2")].FluentValidation không hoạt động khi sử dụng WebApi [Route] Attribute

Bây giờ ModelState trở lại đúng bất kể tôi có nhập bất kỳ dữ liệu nào hay không.

Đây là mã của tôi.

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

khiển

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

Input Object

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

Hiển thị bộ điều khiển với cả hai tuyến đường và cũng là một mẫu yêu cầu được gửi đi. – Nkosi

Trả lời

0

Sử dụng bài viết này để tham khảo

Custom Validation in ASP.NET Web API with FluentValidation

Bạn dường như có hầu hết những gì được thực hiện trong bài viết tham chiếu.

Kiểm tra thứ tự cấu hình của bạn.

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 tự động chèn lỗi vào ModelState. Bạn nên bao gồm một thông báo lỗi.

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

Bài viết có một số nội dung nằm ngoài phạm vi câu hỏi của bạn. chủ yếu là gói các câu trả lời nhưng mọi thứ khác sẽ phù hợp với bạn.

Các vấn đề liên quan