0

我一直在努力解决一个问题,即如果您在 ASP.NET Core 中使用数据注释进行模型验证并运行patchDoc.ApplyTo(newData);,然后if (!TryValidateModel(newData))您会遇到补丁文档中未包含的操作的模型验证错误。

如果一个属性之前为 null 并且它有一个[Required]属性,它将给出模型状态验证错误,尽管我没有在补丁文档中包含该属性。

4

1 回答 1

0

我的开始解决方案是添加一个扩展方法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);
            }
        }
    }

此方法存在一些问题,例如,当您想要更改数组属性时,这将无法正常工作,但这是一个好的开始。希望它可以帮助某人!:)

于 2020-11-25T10:32:13.770 回答