Как применить частичную проверку ModelState для JsonPatch в ASP.NET Core

Я боролся с проблемой, что если вы используете аннотации данных для проверки модели в ASP.NET Core и запускаете patchDoc.ApplyTo(newData);, а затем if (!TryValidateModel(newData)), вы получаете ошибки проверки модели для операций, не включенных в документ исправления.

Если раньше свойство было пустым и имеет атрибут [Required], оно выдаст ошибку проверки состояния модели, хотя я не включил это свойство в документ исправления.


person BigThinker    schedule 25.11.2020    source источник


Ответы (1)


Мое исходное решение — добавить метод расширения для 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);
            }
        }
    }

Есть проблемы с этим методом, например, когда вы хотите изменить свойство массива, это не будет работать как есть, но это хорошее начало. Надеюсь, это поможет кому-то! :)

person BigThinker    schedule 25.11.2020