【问题标题】:ModelState is invalid for a nullable propertyModelState 对于可为空的属性无效
【发布时间】:2020-11-12 04:09:13
【问题描述】:

我有一个模型,其中 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

【问题讨论】:

  • 您的CompanyID字段不是[必填],所以它不应该是无效的ModelState的原因。检查您提交的 ReportTemplateID,它在发布时是否有任何价值。
  • @Imran ReportTemplateID 将永远满足Required 如果我没记错的话,不管它是否通过。
  • 我会说由于某种原因 "null" 被传递给 CompanyID 不能变成有效的 int?
  • @Imran,我希望 CompanyID 被接受为 null,所以我省略了 [必填]
  • 请添加您的表单代码。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    从选择元素中选择我的“CustomerId”时,我遇到了类似的问题。 通过设置选择的默认选项的值解决了问题:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-03
        • 1970-01-01
        相关资源
        最近更新 更多