2

我希望通过使用 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(使用提琴手)

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 中填充?

4

2 回答 2

3

在这个bug中提到了这个问题:http: //aspnetwebstack.codeplex.com/workitem/562 ...声称要修复但在刚刚发布的4.0中仍然存在。

问题是 Newtonsoft Json 将一个数字反序列化为 Int64,它未能通过 IsAssignable 对 int 的测试,因此它被跳过。guid 与字符串的类似问题。

您应该能够通过使用 OData 媒体类型格式化程序来解决此问题,这些格式化程序是通过从 ODataController 而不是 ApiController 派生来启用的。但是,这对我没有影响 - int 值仍然不起作用(但是当我将数据类型更改为 Int64 时,它起作用了)。

I would love to see a working example of posting json with a patch delta that contains an int.

于 2013-02-19T04:31:56.553 回答
0

我可以大胆猜测 PersonId 发生了什么,但无法解释 NumVacationDays。我的猜测是 PersonId 是 Person 实体的关键属性,默认情况下 OD​​ataFormatter 不会修补关键属性。如果您想要这种行为,您可以将 ODataMediaTypeFormatter.PatchKeyMode 上的设置更改为 Patch。

此外,在操作中查看 person.GetChangedPropertyNames() 的值以查看 PersonId 和 NumVacationDays 是否实际显示在那里会很有趣。

于 2012-11-28T01:39:32.307 回答