我希望使用Delta包装器对web api控制器操作进行部分更新。
我有这样的模型:
public class Person
{
public Guid PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsActive { get; set; }
public int NumVacationDays { get; set; }
public double Salary { get; set; }
}
我有这样的api控制器:
public void Put(Delta<Person> person)
{
var p = person.GetEntity();
Person existingPerson = _repository.Get(p.PersonId);
person.Patch(existingPerson);
_repository.Update();
return;
}
我这样调用web api(使用fiddler)
url: http://localhost:49933/api/Person (PUT)
Response Body
{
"PersonId": "b269c49f-8a90-41d6-b102-7cfba3812b1c",
"FirstName": "sample string 2",
"LastName": "sample string 3",
"IsActive": true,
"NumVacationDays": 5,
"Salary": 6.1
}
The controller is hit and al
l除了NumVacationDays(为0)和PersonId(默认为00000000-0000-0000-0000-000000000000)之外,填充的数据
有谁知道为什么GUID和int字段没有从json填充?
答案 0 :(得分:3)
此错误中提到了此问题:http://aspnetwebstack.codeplex.com/workitem/562 ...声明已修复,但仍然存在于刚刚发布的4.0中。
问题在于,Newtonsoft Json将一个数字反序列化为Int64,无法将IsAssignable测试为int,因此它被跳过。 GUID与字符串类似的问题。
您应该能够通过使用OData媒体类型格式化程序来解决这个问题,这些格式化程序是通过从ODataController而不是ApiController派生来启用的。但是这对我没有影响 - int值仍然不起作用(但是当我将数据类型更改为Int64时,它可以工作)。
我很想看到一个发布json的工作示例,其中包含一个包含int的补丁delta。
答案 1 :(得分:0)
我可以猜测PersonId发生了什么,但无法解释NumVacationDays。我的猜测是PersonId是Person实体的关键属性,默认情况下ODataFormatter不会修补关键属性。如果您想要这种行为,可以将ODataMediaTypeFormatter.PatchKeyMode上的设置更改为Patch。
此外,在操作中查看person.GetChangedPropertyNames()的值以查看PersonId和NumVacationDays是否实际显示在那里会很有趣。