17

私はこのモデルを持っていると仮定します

public partial class Todo
{
    public int id { get; set; }
    public string content { get; set; }
    public bool done { get; set; }
}

そして、これをjsonデータとしてコントローラーにパッチリクエストとして送信します。これは、チェックボックスを切り替えるだけのアクションです。モデル全体ではなく、サーバーにのみ送信したいのは理にかなっていると思います。

{ "id":1, "done" : true }

この単純な json パッチ リクエストを正しく処理するために、WebApi コントローラーはどのように見える必要がありますか? これには Web API を使用する必要がありますか、それとも mvc でより rpc スタイルのアプローチを使用する必要がありますか?

それは非常に基本的なことのように思えますが、正しく理解できないようです! コントローラーメソッドで別のパラメーターを使用する必要があるかもしれないと思いますが、よくわかりません。

お時間をいただきありがとうございます。

4

4 に答える 4

12

メソッドを PATCH に変更しても、Web API の動作はまったく変わりません。部分的な更新を行う組み込みのメカニズムはありません。長い間 PATCH メソッドが存在しなかった理由の 1 つは、リソースにパッチを適用するためのユビキタスなメディア タイプがないことです。

次に、オブジェクトのシリアル化を Web API に依頼しているため、部分的に更新されたオブジェクトを適用するという概念はありません。null 値とは何を意味するのか、空の値とは何なのか、「この DateTime を更新しない」とはどのように言えばよいのかなど、合意すべき慣習はたくさんあります。関連オブジェクト、子アイテムはどうですか? 子アイテムを削除するにはどうすればよいですか? CLR チームが別の型のメンバーのサブセットのみを含む型の概念を実装しない限り、部分的な更新とオブジェクトのシリアル化はうまくいきません。

Aliostad は UpdateModel について言及しており、HTML フォームから更新する場合に可能です。これは、メディア タイプapplication/x-www-form-urlencodedが名前と値のペアの任意のセットを明示的に許可するためです。「オブジェクトのシリアル化」は行われていません。これは、フォームの名前がモデル オブジェクトの名前と一致するだけです。

私自身、部分的な更新を行うために使用する新しいメディア タイプを作成しました。これはフォームのように機能しますが、階層データを処理でき、更新の順序を維持できるという点でより高度です。

于 2012-04-26T12:36:32.543 に答える
12

OData プレリリース Nuget パッケージに PATCH 機能があります: Microsoft.AspNet.WebApi.OData

これを使用して PATCH を処理するアクションを作成する方法については、ASP.NET Web API での OData サポートに関するブログ投稿の部分的な更新 (PATCH 要求)セクションを参照してください。

于 2012-09-18T10:21:05.497 に答える
2

ASP.NET Web APIが欠落しているようですUpdateModelTryUpdateModelなど。

ASP.NET MVCでは、これらを使用して目的の効果を実現できます。ASP.NET Web Stackで、投票できる作業項目を作成しました。十分な投票数が得られれば、実装されます。

于 2012-04-26T12:28:59.737 に答える