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

#validation #asp.net-core #modelstate #json-patch #modelstatedictionary

#проверка #asp.net-ядро #состояние модели #json-исправление #modelstatedictionary

Вопрос:

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

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

Ответ №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
                amp;amp; !patchDoc.Operations
                    .Any(op => op.path
                        .TrimStart('/')
                        .Replace('/', '.')
                        .IndexOf(modelStateKey, StringComparison.OrdinalIgnoreCase) > -1))
            {
                modelState.Remove(modelStateKey);
            }
        }
    }
 

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