【问题标题】:ASP.NET core model validation doesn't work as expectedASP.NET 核心模型验证无法按预期工作
【发布时间】:2019-10-01 04:08:48
【问题描述】:

根据 Microsoft 文档,如果模型属性不可为空,则默认认为它是必需的,因此无需显式添加 [Required] 属性。

默认情况下,验证系统将不可为空的参数或属性视为具有 [Required] 属性。十进制和整数等值类型是不可为空的。 https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.2#required-attribute

但实际上并非如此。假设我有以下模型:

public class Model
{
    [Required]
    public string Name { get; set; }
    public int Age { get; set; }
}

如果请求的正文中不包含 Age,则 0 将绑定到 Age 属性并且模型验证不会失败。即使使用[Required],模型验证仍然不会失败,并且0 分配给Age。那么如何使不可为空类型的属性真正“必需”?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-webapi model-validation


    【解决方案1】:

    三个选项恕我直言:

    • 验证自己 Age 不是 default
    • 使用Range 属性
    • 将其设为必需并nullable
    [Required]
    public int? Age { get; set; }
    

    如果 nullable-required 是一个很好的解决方案还是只是一个肮脏的解决方法,这在很大程度上取决于您的情况。

    【讨论】:

    • [BindRequired] 可能是更好的选择。
    • @KirkLarkin 仍然 ModelState.IsValid 为真,也许它只是在将opt.SuppressModelStateInvalidFilter = value; 设置为defaultfalse 而不是true 进入操作之前工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2017-03-17
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多