c# - ModelState 对于可为 null 的属性无效

标签 c# asp.net-core razor-pages ef-core-3.0 model-validation

我有一个模型,其中属性 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 验证,表单将按预期工作

ModelState Invalid

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

使用 EF Core 3.0 的 Razor 页面,可空引用类型已禁用

非常感谢

编辑-the invalid object at time of validation

最佳答案

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

例如,不发送以下 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 中(我没有检查其他版本)。

关于c# - ModelState 对于可为 null 的属性无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63037205/

相关文章:

c# - 在 MVC6 中,如何阻止直接访问 wwwroot 中的文件夹?

c# - 更改 ASP.NET Core Razor 页面中的默认路由

javascript - 使用动态 HTML 包装 Razor 页面

c# - 如何将枚举传递给函数以及如何在 if 语句 c# 中评估枚举

c# - 在 WPF 中获取控件的可见大小

c# - 使用 IPageRouteModelConvention 时获取版本

c# - Razor 页面 : Does OnGet Handler "accept" a request body?

c# - 类型参数的约束 : interface vs. 抽象类

c# - 使用自己的 app.config 的插件

c# - 同一个库之间的调用不明确?