为了避免使用 Tuple<,> 并减少传递输入模型和可选验证错误时使用的类型数量,我已将 FluentValidation 中的列表作为属性包含在输入模型中。
使用 Razor 模板渲染响应时,验证失败用于向表单添加错误类和显式错误。
处理 POST 请求失败,因为处理程序尝试将属性与发布的数据中的 List 绑定。
有没有办法从表单绑定中排除该属性?
常用属性 [BindNever] 和 [JsonIgnore] 在这种情况下不起作用。
示例代码:
输入型号:
public class CreateToDoModel
{
// Should be bound
public string Description { get; set; }
// Should be bound
public string Due { get; set; }
// Should NOT be bound
public List<FluentValidation.Results.ValidationFailure>? Errors { get; set; }
}
处理者:
app.MapPost($"/todos", async (IMediator mediator, [FromForm] CreateToDoModel model, IValidator<CreateToDoModel> validator, IHttpContextAccessor context) =>
{
model.Errors = (await validator.ValidateAsync(model)).Errors;
// Any validation errors? If so, re-render the view.
if (model.Errors.Count !=0 ) return Results.Extensions.RazorSlice($"{TemplatePath}Create.cshtml", model);
// Validation ok - send command
var result = await mediator.Send(new CreateToDoCommand { Description = model.Description, Due = DateOnly.Parse(model.Due) });
// (Error handling excluded)
}
IgnoreDataMemberAttribute
:
public class CreateToDoModel
{
// Should NOT be bound
[IgnoreDataMember]
public List<ValidationFailure>? Errors { get; set; }
}
使用内部设置器也可以:
public class CreateToDoModel
{
// Should NOT be bound
public List<ValidationFailure>? Errors { get; internal set; }
}
Minimal API 与 MVC 有很大不同,它使用自己的一组绑定器,这些绑定器首先是为了性能目标而设计的。如果我理解正确 - 您可以看到当前的实现如何构建一组属性来绑定here。