【问题标题】:ASP.NET Core Razor PageModel ModelState Invalid because of new Navigation Property with Id==0ASP.NET Core Razor PageModel ModelState 无效,因为 Id==0 的新导航属性
【发布时间】:2020-02-19 09:19:09
【问题描述】:

我正在尝试从 html 表单更新可能具有可选 NavigationProperty 的实体。

public class ProcessDataGroup
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ReadDataGroupStrategy ReadDataGroupStrategy { get; set; }
    public ReadBlockDefinition ReadBlockDefinition { get; set; }
    public int? ReadBlockDefinitionId { get; set; }
}

public class ReadBlockDefinition
{
    public int Id { get; set; }
    public string Address { get; set; }
    public int Length { get; set; }
    public int Offset { get; set; }
}

如果ReadBlockDefinition 已经存在并且有一个Id > 0,则此方法有效。我将该实体附加到我的DbContext,它将被更新。 但有可能在 html 表单中更改了 ReadDataGroupStrategy,然后创建了一个新的 ReadBlockDefinition,默认情况下,Id 的值当然是 0。 在这种情况下,ModelState.IsValid 将返回 false 和调试期间的调查发现它在抱怨 ReadBlockDefinition.Id 字段,所以它似乎不会接受 0 那里。 我无法跳过 ReadBlockDefinition ViewModel 中的 Id 字段,因为它对于更新至关重要。

我目前的解决方法是

if(ProcessDataGroup?.ReadBlockDefinition?.Id == 0)
    ModelState.Remove("ProcessDataGroup.ReadBlockDefinition.Id");

在评估ModelState.IsValid 之前,但这对我来说似乎是一个相当奇怪的解决方案。我通常不确定为什么验证首先会失败。据我所知,验证与 EF Core 或任何底层技术无关,0 应该是一个完全有效的整数。

任何想法如何克服这个问题?还是 ModelState.Remove(...) 方法是预期的?

【问题讨论】:

  • 你的项目是什么版本的?您的页面和 PageModel 之间的逻辑是什么?您能否分享有关剃刀页面和处理程序的更多详细信息?

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


【解决方案1】:

您是否考虑过为 Id 设置数据注释?

public class ReadBlockDefinition
{
    [Key]
    public int Id { get; set; }
    public string Address { get; set; }
    public int Length { get; set; }
    public int Offset { get; set; }
}

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2023-01-17
    • 2020-02-10
    • 2020-11-12
    • 2018-07-17
    • 1970-01-01
    • 2018-10-08
    • 2021-11-09
    • 2023-03-13
    相关资源
    最近更新 更多