我一直在努力解决一个问题,即如果您在 ASP.NET Core 中使用数据注释进行模型验证并运行patchDoc.ApplyTo(newData);
,然后if (!TryValidateModel(newData))
您会遇到补丁文档中未包含的操作的模型验证错误。
如果一个属性之前为 null 并且它有一个[Required]
属性,它将给出模型状态验证错误,尽管我没有在补丁文档中包含该属性。
我一直在努力解决一个问题,即如果您在 ASP.NET Core 中使用数据注释进行模型验证并运行patchDoc.ApplyTo(newData);
,然后if (!TryValidateModel(newData))
您会遇到补丁文档中未包含的操作的模型验证错误。
如果一个属性之前为 null 并且它有一个[Required]
属性,它将给出模型状态验证错误,尽管我没有在补丁文档中包含该属性。
我的开始解决方案是添加一个扩展方法ModelStateDictionary
,看起来像这样
public static void ApplyPatchDocument<T>(this ModelStateDictionary modelState, JsonPatchDocument<T> patchDoc) where T : class
{
if (modelState == null)
{
throw new ArgumentNullException(nameof(modelState));
}
if (patchDoc == null)
{
throw new ArgumentNullException(nameof(patchDoc));
}
var modelStateKeys = modelState.Keys.ToList();
for (var i = modelStateKeys.Count - 1; i >= 0; i--)
{
var modelStateKey = modelStateKeys[i];
var modelStateEntry = modelState[modelStateKey];
if (modelStateEntry.Errors.Count > 0
&& !patchDoc.Operations
.Any(op => op.path
.TrimStart('/')
.Replace('/', '.')
.IndexOf(modelStateKey, StringComparison.OrdinalIgnoreCase) > -1))
{
modelState.Remove(modelStateKey);
}
}
}
此方法存在一些问题,例如,当您想要更改数组属性时,这将无法正常工作,但这是一个好的开始。希望它可以帮助某人!:)