为了避免使用Tuple<和>,并减少传递输入模型时使用的类型数量和可选的验证错误,我将来自FluentValidation的列表作为属性包含在输入模型中.

当使用Razor模板呈现响应时,验证失败用于向表单添加错误类和显式错误.

处理POST请求失败,因为处理程序try 将属性与发布的数据中的列表绑定.

有没有办法从表单绑定中排除该属性?

通常的属性[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)
}

推荐答案

如果您想在最少的API中忽略来自绑定的属性,一种 Select 是使用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(或here)的.

Csharp相关问答推荐

向类注入一个工厂来创建一些资源是一个好的实践吗?

C#相同名称的枚举方法和normal方法,参数类型不同

解析需要HttpClient和字符串的服务

如何在C#中删除一个特殊字符,如"使用Regex"

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

使页面内容居中

查找表中的模式

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

如何让NLog停止写入冗余信息?

在Docker容器中运行API项目时,无法本地浏览到index.html

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

为什么Docker中没有转发该端口?

当try 测试具有协变返回类型的抽象属性时,类似功能引发System.ArgumentException

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

使用ASP.NET MVC for Lemon Squeezy X-Signature创建散列

C#中COM对象的实际地址

C#-如何将int引用获取到byte[]

.NET8支持Vector512,但为什么向量不能达到512位?

MS Project读取项目自定义域

MudBlazor MudTabs-->;选项卡内容高度