MVC4 WebApi OData Delta <t>未填充GUID或Int字段</t>

时间:2012-11-27 04:37:29

标签: asp.net-mvc-4 asp.net-web-api odata

我希望使用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填充?

2 个答案:

答案 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是否实际显示在那里会很有趣。