2016-04-28 6 views
7

मैं सफलतापूर्वक मेरी WebAPI परियोजना नियंत्रक है कि केवल एक HttpGet विधि था में FluentValidation कार्यान्वित का उपयोग करना। जब मैंने एक और HttpGet विधि जोड़ा, तो मैंने दोनों तरीकों से मार्ग विशेषता जोड़ा। यानी [मार्ग ("विधि 1")] और [मार्ग ("विधि 2")]।FluentValidation काम नहीं करता जब WebAPI [रूट] गुण

अब ModelState कि क्या मैं किसी भी डेटा दर्ज हो या नहीं वापस सच के रूप में आता है।

मेरा कोड यहां है।

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

नियंत्रक

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

इनपुट वस्तु

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

दोनों मार्गों के साथ नियंत्रक दिखाएं और अनुरोध के नमूने को भी नमूना दिखाएं। – Nkosi

उत्तर

0

संदर्भ

Custom Validation in ASP.NET Web API with FluentValidation

के लिए इस लेख का उपयोग करते हुए आप क्या संदर्भित लेख में किया जाता है के सबसे लगता है।

अपने कॉन्फ़िगरेशन ऑर्डर की जांच करें।

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 स्वचालित रूप से ModelState में अपनी त्रुटियों डाल देता है। आपको एक त्रुटि संदेश शामिल करना चाहिए।

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

लेख में कुछ सामग्री है जो आपके प्रश्न के दायरे से बाहर है। मुख्य रूप से प्रतिक्रियाओं को लपेटते हैं लेकिन बाकी सब कुछ आपके लिए काम करना चाहिए।

संबंधित मुद्दे