【发布时间】:2020-11-13 15:34:54
【问题描述】:
给定以下模型、验证器和控制器(在 ASP.NET Core 3.1 中):
public sealed class Model
{
public string Property { get; set; }
}
public sealed class ModelValidator : AbstractValidator<Model>
{
public ModelValidator()
{
RuleFor(m => m.Property).NotEmpty();
}
}
[ApiController]
[Route("[controller]")]
public sealed class TheController : ControllerBase
{
[HttpPost]
public IActionResult PostSomething(IEnumerable<Model> model)
{
// Do something
return Ok();
}
}
有没有一种方法可以验证TheController.PostSomething 的IEnumerable<Model> 模型,而无需在我的启动类中启用ImplicitlyValidateChildProperties,如下所示?
services.AddControllers()
.AddFluentValidation(c => c.ImplicitlyValidateChildProperties = true);
到目前为止,我一直无法找到在不设置 ImplicitlyValidateChildProperties = true 的情况下成功验证可枚举模型的方法。
更新:当更改PostSomething 的签名,并添加和注册额外的验证器(如下所示)时,确实会发生验证。
[HttpPost]
public IActionResult PostSomething(List<Model> model)
{
// Do something
return Ok();
}
public sealed class ListOfModelValidator : AbstractValidator<List<Model>>
{
public ListOfModelValidator()
{
RuleForEach(m => m).SetValidator(new ModelValidator());
}
}
但是,这感觉不对。它还会导致返回的ValidationProblemDetails 响应出现问题。具有验证错误的元素的索引将以 lambda 参数的名称为前缀,因此 [0].Property 将替换为 m[0].Property。我一直无法找到删除 lambda 参数名称的方法,无论是使用 WithName 还是自定义 DisplayNameResolver。
但是,这种方法感觉不对。我宁愿不必更改 PostSomething 的签名或添加一些感觉像是杂乱无章的东西来删除 lambda 参数名称。
虽然我可以启用 ImplicitlyValidateChildProperties,但它可能会导致我需要进行一些更改,因此我希望尽可能避免它。
【问题讨论】:
标签: c# asp.net-core asp.net-core-3.1 fluentvalidation