// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace Microsoft.AspNetCore.Mvc { /// /// Extensions for /// public static class JsonPatchExtensions { /// /// Applies JSON patch operations on object and logs errors in . /// /// The . /// The entity on which is applied. /// The to add errors. public static void ApplyTo( this JsonPatchDocument patchDoc, T objectToApplyTo, ModelStateDictionary modelState) where T : class { if (patchDoc == null) { throw new ArgumentNullException(nameof(patchDoc)); } if (objectToApplyTo == null) { throw new ArgumentNullException(nameof(objectToApplyTo)); } if (modelState == null) { throw new ArgumentNullException(nameof(modelState)); } patchDoc.ApplyTo(objectToApplyTo, modelState, prefix: string.Empty); } /// /// Applies JSON patch operations on object and logs errors in . /// /// The . /// The entity on which is applied. /// The to add errors. /// The prefix to use when looking up values in . public static void ApplyTo( this JsonPatchDocument patchDoc, T objectToApplyTo, ModelStateDictionary modelState, string prefix) where T : class { if (patchDoc == null) { throw new ArgumentNullException(nameof(patchDoc)); } if (objectToApplyTo == null) { throw new ArgumentNullException(nameof(objectToApplyTo)); } if (modelState == null) { throw new ArgumentNullException(nameof(modelState)); } patchDoc.ApplyTo(objectToApplyTo, jsonPatchError => { var affectedObjectName = jsonPatchError.AffectedObject.GetType().Name; var key = string.IsNullOrEmpty(prefix) ? affectedObjectName : prefix + "." + affectedObjectName; modelState.TryAddModelError(key, jsonPatchError.ErrorMessage); }); } } }