繁体   English   中英

ASP.NET 内核 Razor PageModel ModelState 无效,因为新的导航属性 Id==0

[英]ASP.NET Core Razor PageModel ModelState Invalid because of new Navigation Property with Id==0

我正在尝试从 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 应该是完全有效的 integer。

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

您是否考虑过为 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM