- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 HttpPatch 部分更新对象。为了使它正常工作,我使用了 OData 中的 Delta 和 Patch 方法(此处提到:What's the currently recommended way of performing partial updates with Web API?)。一切似乎都运行良好,但注意到映射器区分大小写;当传递以下对象时,属性正在获取更新值:
{
"Title" : "New title goes here",
"ShortDescription" : "New text goes here"
}
但是当我传递具有小写或驼峰式属性的同一个对象时,Patch 不起作用 - 新值没有通过,所以看起来反序列化和属性映射存在问题,即:“shortDescription”到“简短说明”。
是否有配置部分会使用 Patch 忽略区分大小写?
仅供引用:
在输出中,我使用以下格式化程序具有驼峰式属性(遵循 REST 最佳实践):
//formatting
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings = jss;
//sample output
{
"title" : "First",
"shortDescription" : "First post!"
}
然而,我的模型类遵循 C#/.NET 格式约定:
public class Entry {
public string Title { get; set;}
public string ShortDescription { get; set;}
//rest of the code omitted
}
最佳答案
简短的回答,没有配置选项来撤销区分大小写(据我所知)
长答案:我今天遇到了和你一样的问题,这就是我解决它的方法。
我发现它必须区分大小写非常烦人,因此我决定取消整个 oData 部分,因为它是我们正在滥用的一个巨大的库....
可以在我的 github github 中找到此实现的示例
我决定实现我自己的补丁方法,因为这是我们实际上缺乏的力量。我创建了以下抽象类:
public abstract class MyModel
{
public void Patch(Object u)
{
var props = from p in this.GetType().GetProperties()
let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))
where attr == null
select p;
foreach (var prop in props)
{
var val = prop.GetValue(this, null);
if (val != null)
prop.SetValue(u, val);
}
}
}
然后我让我所有的模型类都继承自 *MyModel*。请注意我使用 *let* 的那一行,稍后我会对此进行解释。所以现在您可以从您的 Controller 操作中删除 Delta,然后再次将其设置为 Entry,就像 put 方法一样。例如
public IHttpActionResult PatchUser(int id, Entry newEntry)
您仍然可以像以前一样使用补丁方法:
var entry = dbContext.Entries.SingleOrDefault(p => p.ID == id);
newEntry.Patch(entry);
dbContext.SaveChanges();
现在,让我们回到正题
let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))
我发现任何属性都可以通过补丁请求进行更新存在安全风险。例如,您现在可能希望通过补丁更改 ID。我创建了一个自定义属性来装饰我的属性。 NotPatchable 属性:
public class NotPatchableAttribute : Attribute {}
您可以像使用任何其他属性一样使用它:
public class User : MyModel
{
[NotPatchable]
public int ID { get; set; }
[NotPatchable]
public bool Deleted { get; set; }
public string FirstName { get; set; }
}
此调用中的 Deleted 和 ID 属性不能通过补丁方法更改。
我希望这也能为您解决。如果您有任何问题,请随时发表评论。
我添加了一张我在新的 mvc 5 项目中检查 Prop 的屏幕截图。如您所见,Result View 填充了 Title 和 ShortDescription。
关于c# - 使用 OData 补丁的 asp.net mvc web api 部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513639/
我在本地创建了一个 OData 应用程序。请求地址为“http://localhost:5182/odata/Users” [EnableQuery] public IHttpActionR
有可用的使用 WCF 数据服务(ADO.NET 数据服务)的 OData 服务。我需要以编程方式使用 OData 服务。从某种意义上说,我不想使用 DataSvcUtil 创建代理。相反,我需要在运行
这是设置:我有一个“学生”,他有一个相关的实体“类(class)”(一对多)。每个“类(class)”都有一个相关实体“期间”,其中包含类(class)的所有时间和日期详细信息。我想找回所有在 201
我想知道是否有或为什么没有用于 Java 的 ADO.NET 数据服务服务器库? 我需要从 Java 服务器公开数据库,但我只看到 Microsot 为 Java 提供客户端,而不是服务器部分。 当您
我正在使用 odata api,现在我在一个实体上有一个属性,它是一个选项,如下所示: 属性名称是:status值为:1、2、3名称:完成,进度,新 问题是当我使用 postman 获取元数据时,我得
处理文件流 GET、POST 和 DELETE 操作的推荐方法是什么。我得到了以下有关如何操作的链接,但它适用于 V3 版本。在将此解决方案移植到 OData V4 伊朗时,会产生一系列问题,这些问题
我对 Odata 主题很陌生,并尝试了解使用 OData 服务时的最佳实践方案是什么。 方案 1: 我有一个复杂的应用程序,其中包含来自远程 Odata 模型的多个 EntitySet,该模型是从 S
OData 被吹捧为 REST 样式数据服务的新开放标准,但我找不到太多证据表明它被任何未加入 MSFT 开发人员社区的人愤怒地使用。如果它是一个开放标准,我会期待 Java/Ruby/Python/
我正在创建分页并每页获取 10 条 JSON 记录: var coursemodel = query.Skip(skip).Take(take).ToList(); 我需要在网页上显示数据库中可用
我正在尝试使用此 URL 在 OData 中进行一些自定义排序 localhost:82/odata.svc/ComponentPresentations?$filter=TemplateId eq
给定一个已知的 OData 端点,确定 OData 服务版本的最佳方法是什么?此场景中的客户端可以支持任何版本(1-4),但我需要知道如何格式化请求。 例如,OData-Version为 V4 服务返
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我的应用程序的 Controller 大多调用一个数据源,没有任何问题。 但是,其中之一使用三个单独的数据源,有时在访问它们时会返回 403 Forbidden 错误。 "dataSources":
在我的职业生涯中,我已经使用过OData了很多,现在,来自不同团队的同事中很少有人建议我们使用JsonAPI和GraphQL,因为它与Microsoft无关。我对这两种查询语言都没有太多的经验。据我所
我正在尝试创建对 odata webservice 的调用,该调用将仅选择某些属性的不同值。有没有很好的例子说明如何做到这一点? 最佳答案 目前,OData 协议(protocol)不支持 disti
我必须对名称包含空格的字段进行 $filter 查询。例如,$filter=票号,例如“abc_123” 我开始认为这是不可能的。有人可以帮我解决这个问题吗? 谢谢。 最佳答案 我想分享这个,我试图通
我正在开发一个需要与 OData 服务(确切地说是 Microsoft Dynamics CRM)通信的应用程序。我有一个要求,我只需要知道实体具有哪些所有属性。 例如 [Organization U
我正在尝试访问 OData 源提供程序,特别是 SAP HANA 通过 Odata 服务公开的分析 View 。我正在 odata 上应用包含数字的过滤器,但收到一条错误消息,指出不支持使用该数字,因
我正在创建一个 SAPUI5 应用程序。此应用程序通过 OData 连接到后端 SAP 系统。在 SAPUI5 应用程序中,我使用了智能图表控件。开箱即用的智能图表允许用户为基础数据创建过滤器。这工作
我已使用 this generator 成功生成 OData 客户端代码访问我的 Dynamics CRM WebApi 服务。不幸的是,对于一个普通的组织,它生成了一个 ~30 MB 的 cs 文件
我是一名优秀的程序员,十分优秀!