#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);
}
}
}
С этим методом есть проблемы, например, когда вы хотите изменить свойство массива, это не будет работать так, как есть, но это хорошее начало. Надеюсь, это кому-то поможет! 🙂