从 .NET 8 Minimal API 中的表单绑定中排除属性

问题描述 投票:0回答:1

为了避免使用 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)
}
.net minimal-apis
1个回答
0
投票

如果您想忽略最小 API 中绑定的属性,一种选择是使用

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

© www.soinside.com 2019 - 2024. All rights reserved.