ASP.NET Core Razor PageModel ModelState无效,因为具有ID == 0的新导航属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Core Razor PageModel ModelState无效,因为具有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将在调试过程中返回错误和调查结果,发现它抱怨ReadBlockDefinition.Id字段,因此似乎在此处不会接受0。我无法从ReadBlockDefinition ViewModel跳过Id字段,因为它对于更新至关重要。

目前我的解决方法是

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

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

任何想法如何克服这个问题?还是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

以上是关于ASP.NET Core Razor PageModel ModelState无效,因为具有ID == 0的新导航属性的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Razor 页面与完整 MVC Core [关闭]

Asp.net core razor pages 加载部分页面

ASP .NET Core Razor 页面中的授权

Asp.Net Core 上的 Razor 页面 - 添加了 Razor 页面但无法让页面显示

Asp .NET Core 2.2 Razor 页面布局和局部

Asp.Net Core-几行代码解决Razor中的嵌套if语句