ModelState 对于可为 null 的 属性 无效

ModelState is invalid for a nullable property

我有一个模型,其中 属性 CompanyID 允许空值

public partial class ReportTemplateItem
{
    [Key]
    public int ReportTemplateItemID { get; set; }

    [Required]
    public int ReportTemplateID { get; set; }
    
    public int? CompanyID { get; set; }
}

在 DBContext OnModelCreating 中,没有为 CompanyID

声明的 属性

但是发布时 ModelState 无效。如果我删除 ModelState validation

,表单将按预期工作

ModelState Invalid

接受空值似乎是模型验证的默认行为,我错过了什么?

带有 EF Core 3.0 的 Razor 页面,可空引用类型被禁用

非常感谢

编辑 - the invalid object at time of validation

当我的“CustomerId”是从 select 元素 select 编辑时,我遇到了类似的问题。 通过 select:

的默认选项的设置值解决了问题
<select asp-for="CustomerId" asp-items="@ViewBag.CustomersList" >
      <option value="0">please select...</option>
</select>

在为我的操作方法中的默认选项设置 value="0" 之前,ModelState.IsValid 始终为假,尽管模型中的 CustomerId 属性 可以为 null。

如果这有任何帮助,您可以尝试根本不发送空值(将其从发送的数据中排除)。

例如,不发送以下 json 数据:

    var data = {
        reportTemplateItemID: 1,
        reportTemplateID: 2,
        companyID: null
    };

仅发送:

    var data = {
        reportTemplateItemID: 1,
        reportTemplateID: 2
    };

如果您有一个复杂的对象,您可以在进行 ajax 调用之前轻松去除所有空值:

// let's remove null and undefined values
// an easy way is to serialize using a replacer function and deserialize back
const str = JSON.stringify(data, function(key, value) { return value === null ? undefined : value; });
const newData = JSON.parse(str);

看看它是如何工作的:

var data = { "aaa" : undefined, "bbb": null, ccc : ""}
// newData = "{"ccc":""}"

ModelState 验证在这种情况下不会失败(只要值类型可为空),至少在 ASP.NET Core 3.1 中是这样(我没有检查其他版本)。

在您的代码中,如果您有输入或 select,如果您尝试将值设置为零 这可能会导致数据库中出现约束问题 解决方案是设置 value="" 以及为什么它起作用并且根本不设置值导致验证错误是因为验证检查是 运行 针对原始值,在我们的例子中将是字符串“null”而不是真正的 null 就这样吧

 <select asp-for="CustomerId" asp-items="@ViewBag.CustomersList" >
      <option value="">please select...</option>
</select>

这样就解决了绑定错误的问题 希望 MS 团队负责下一个 .net 核心版本