gpt4 book ai didi

c# - 使用 OData 补丁的 asp.net mvc web api 部分更新

转载 作者:太空狗 更新时间:2023-10-29 22:26:42 25 4
gpt4 key购买 nike

我正在使用 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。

Example of inspecting the props

关于c# - 使用 OData 补丁的 asp.net mvc web api 部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com