我正在尝试更新主干模型,服务器端是 asp.net mvc 4。我得到:
"System.ArgumentException: An item with the same key has already been added" exception.
原因是因为backbone将Id和id作为属性发送到服务器,并且JsonValueProvider尝试将其添加到字典中。
这是我的模型:
var Task = Backbone.Model.extend({
url: "/tasks/task",
idAttribute: "Id"
});
这是通过 Put 请求发送到服务器:
{"Id":294912,"Task":"test","DueDate":"2012-03-24T02:00:00.000Z", "id":294912}
有没有办法阻止 Backbone 发送“id”属性?
最佳答案
这里的问题是因为 C# 中的约定与 JavaScript 中的约定不同。在 C# 中,类的属性以大写字母(Pascal Case)开头,而 JavaScript 中的属性通常以小写字母(Camel Case)开头。
因此,当序列化 View 模型时,JSON.NET 序列化程序的默认行为是使用相同大小写的属性来精确序列化对象。我可以将 View 模型上的属性重命名为驼峰式大小写,但这就像在 JavaScript 对象中使用帕斯卡大小写的属性一样“奇怪”。
因此,为了强制 Backbone 采用非约定方式,我更改了对象的序列化,通过利用 JSON.NET's Contract Resolver 将 Pascal 大小写属性转换为 Camel 大小写属性。功能。
var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
JsonSerializer serializer = JsonSerializer.Create(settings);
JsonConvert.SerializeObject(object, Formatting.None, settings);
现在,这在客户端与我的代码以及所有很酷的库之间建立了一致性。
关于asp.net-mvc - Backbonejs 更新模型并将 idAttribute 设置为 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9879686/