【发布时间】: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