簡體   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