2

デルタ ラッパーを使用して、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

この問題は次のバグで言及されています: http://aspnetwebstack.codeplex.com/workitem/562 ... 修正する必要がありますが、リリースされたばかりの 4.0 にはまだ存在します。

問題は、Newtonsoft Json が数値を Int64 として逆シリアル化し、IsAssignable を int に渡すテストに失敗するため、スキップされることです。文字列としての GUID に関する同様の問題。

ApiController の代わりに ODataController から派生することで有効になる OData メディア タイプ フォーマッタを使用して、これを修正できるはずです。ただし、これは私には効果がありませんでした.int値はまだ機能しません(ただし、データ型をInt64に変更すると機能します)。

int を含むパッチ デルタを含む json を投稿する実際の例を見てみたいです。

于 2013-02-19T04:31:56.553 に答える
0

PersonIdで何が起こっているかを推測することはできますが、NumVacationDaysを説明することはできません。私の推測では、PersonIdはPersonエンティティのキ​​ープロパティであり、デフォルトではODataFormatterはキープロパティにパッチを適用しません。その動作が必要な場合は、ODataMediaTypeFormatter.PatchKeyModeの設定をPatchに変更できます。

また、アクションでperson.GetChangedPropertyNames()の値を確認して、PersonIdとNumVacationDaysが実際に表示されるかどうかを確認することもできます。

于 2012-11-28T01:39:32.307 に答える