![](/img/trans.png)
[英]Simple Injector Inject into PageModel ASP.NET Core Razor Pages
[英]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.