-
Notifications
You must be signed in to change notification settings - Fork 9.8k
/
JsonPatchExtensions.cs
81 lines (71 loc) · 3.1 KB
/
JsonPatchExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 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
{
/// <summary>
/// Extensions for <see cref="JsonPatchDocument{T}"/>
/// </summary>
public static class JsonPatchExtensions
{
/// <summary>
/// Applies JSON patch operations on object and logs errors in <see cref="ModelStateDictionary"/>.
/// </summary>
/// <param name="patchDoc">The <see cref="JsonPatchDocument{T}"/>.</param>
/// <param name="objectToApplyTo">The entity on which <see cref="JsonPatchDocument{T}"/> is applied.</param>
/// <param name="modelState">The <see cref="ModelStateDictionary"/> to add errors.</param>
public static void ApplyTo<T>(
this JsonPatchDocument<T> 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);
}
/// <summary>
/// Applies JSON patch operations on object and logs errors in <see cref="ModelStateDictionary"/>.
/// </summary>
/// <param name="patchDoc">The <see cref="JsonPatchDocument{T}"/>.</param>
/// <param name="objectToApplyTo">The entity on which <see cref="JsonPatchDocument{T}"/> is applied.</param>
/// <param name="modelState">The <see cref="ModelStateDictionary"/> to add errors.</param>
/// <param name="prefix">The prefix to use when looking up values in <see cref="ModelStateDictionary"/>.</param>
public static void ApplyTo<T>(
this JsonPatchDocument<T> 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);
});
}
}
}