rest – 在ASP.NET Core中实现“JSON Merge Patch” – 最好的方
我想创建和端点符合“
JSON Merge Patch”
https://tools.ietf.org/html/rfc7396
请不要将它与“JavaScript Object Notation(JSON)Patch”混淆 但是,我在区分请求中的两种情况时遇到了一些问题: >删除属性值,此处删除电子邮件值: { surname: "Kowalski" email: null } >不包括属性,因为客户端根本不想更新它,此处不包含电子邮件,因为它不应更新: { surname: "Kowalski" } 出现问题的原因是在模型绑定后的两种情况下,电子邮件的值都为null. 您是否有建议如何实施? 解决方法
您需要3种不同的电子邮件状态:
>更新的填充值(例如test@mail.com) 所以问题实际上是如何在模型的字符串属性中表达这3种状态.您不能仅使用原始字符串属性执行此操作,因为空值和缺失值将如您正确描述的那样发生冲突. public class OptionalValue<T> { private T value; public T Value { get => value; set { HasValue = true; this.value = value; } } public bool HasValue { get; set; } } 然后你需要自定义JsonConverter,它可以将通常的json值反序列化为OptionalValue< T>: class OptionalValueConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(OptionalValue<T>); } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { return new OptionalValue<T> { Value = (T) reader.Value,}; } public override bool CanWrite => false; public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { throw new NotImplementedException(); } } 你的模型看起来像这样: public class SomeModel { public string Surname { get; set; } [JsonConverter(typeof(OptionalValueConverter<string>))] public OptionalValue<string> Email { get; set; } = new OptionalValue<string>(); } 请注意,您使用空OptionalValue< string>()分配电子邮件.如果输入json不包含电子邮件值而不是Email属性,则将其与HasValue设置为false的OptionalValue保持一致. 现在,在控制器操作中,您可以确定电子邮件的3种状态: [HttpPatch] public void Patch([FromBody]SomeModel data) { if (data.Email.HasValue) { // Email presents in Json if (data.Email.Value == null) { // Email should be removed } else { // Email should be updated } } else { // Email does not present in Json and should not be affected } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 从RouteBase.GetVirtualPath返回绝对路径
- 在ASP.Net Web应用程序中使用Rails应用程序中的用户/身份验
- ASP.NET C#图形路径形状
- asp.net – Repeater控件中的水平方向
- asp.net-mvc – Visual Studio Online网站以调试模式部署到
- asp.net – 向通过Google OAuth2创建的用户添加角色或声明
- ASP.Net WebApi身份验证和安全性
- asp.net-mvc-4 – Cshtml无法解析引用
- asp.net-mvc – 带有ASP.NET标识的MVC 5 – 用户登录时获取
- ASP.NET内联编码:变量名不会被值替换