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)
您可以通过将以下属性添加到操作方法参数来跳过验证:
public ActionResult Save([CustomizeValidator(Skip = true)] Customer model) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
此处的文档对此进行了描述: https ://docs.fluidation.net/en/latest/aspnet.html#validator-customization
在@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)
| 归档时间: |
|
| 查看次数: |
2757 次 |
| 最近记录: |