禁用对 asp.net 核心中的操作方法的模型验证

Gui*_*lle 5 c# fluentvalidation asp.net-core

我想对控制器中的特定操作方法禁用模型验证。我有这个场景:

public class SomeDto
{
    public string Name { get; set; }
}

public class SomeDtoValidator : AbstractValidator<SomeDto>, ISomeDtoValidator
{
    public SomeDtoValidator ()
    {
        RuleFor(someDto=> someDto.Name).NotNull().WithMessage("Name property can't be null.");
    }
}
Run Code Online (Sandbox Code Playgroud)

我有 ISomeDtoValidator 因为我以自己的方式注册了所有验证器:

public class Startup
{
    // .... constructor ....

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();
        services.AddMvc(setup => {
        //...others setups...
        }).AddFluentValidation();

        services.RegisterTypes(Configuration)
                .RegisterFluentValidation()
                .RegisterMappingsWithAutomapper()
                .RegisterMvcConfigurations();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 Controller 中有这个 Action 方法:

[DisableFormValueModelBinding]
public async Task<IActionResult> CreateSome(Guid someId, SomeDto someDto)
{
    //..... Manually binding someDto...

    var validator = new SomeValidator();
    validator.Validate(someDto);

    // Doing something more ........

    return Ok();
}       
Run Code Online (Sandbox Code Playgroud)

我禁用了 modelBinding 的 MVC,因为我想在绑定 SomeDto 之前做一些事情,因此,我也不想在 SomeDto 上应用任何验证器。那么,有什么方法可以实现吗??例如,这样的事情:

[DisableValidator] // Or [DisableValidator(typeof(SomeDtoValidator))] whatever
[DisableFormValueModelBinding]
public async Task<IActionResult> CreateSome(Guid someId, SomeDto someDto)
{
    //..... Manually binding someDto...

    var validator = new SomeValidator();
    validator.Validate(someDto);

    // Doing something more ........

    return Ok();
}   
Run Code Online (Sandbox Code Playgroud)

Chr*_*aws 7

您可以通过将以下属性添加到操作方法参数来跳过验证:

public ActionResult Save([CustomizeValidator(Skip = true)] Customer model) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

此处的文档对此进行了描述: https ://docs.fluidation.net/en/latest/aspnet.html#validator-customization


Gui*_*lle 1

在@Alexey.Petriashev 的帮助下,我实现了我的目标,仅在验证器中放入一个规则集。当管道调用验证器时,它不会进行验证,因为管道调用没有规则集。下面是我如何解决该问题的示例:

public class CustomerValidator : AbstractValidator<Customer>
{
    public CustomerValidator()
    {
        RuleSet("Manually", () =>
        {
            RuleFor(x => x.Surname).NotNull();
            RuleFor(x => x.Forename).NotNull();
        });
    }
}

public ActionResult ActionWithoutValidationExecuted(Customer customer) 
{
    //..... Manually binding customer...

    var validator = new CustomerValidator();
    var validResult = validator.Validate(customer, ruleSet: "Manually");

    // Doing something more ........

    return Ok();
}
Run Code Online (Sandbox Code Playgroud)