けさらんぱさらん

方向性は定めず、ただ思いつくままに

ASP.NET WebAPIで差分更新する

なんか久しぶりになってしまった(反省

ASP.NET WebAPIで差分更新(?)をする方法です。
ここで言う差分更新は、クライアントから送られてきた項目だけを
更新するという意味の差分更新です。

普通にモデルバインドするとnullだったりデフォルト値がクライアントから送られてきたのか
送られてこなかったからnullなのかが分かりません。
さてどうするのん?って思ってたらちゃんとやり方がありました。

Putメソッドを使っても良いですが最近はどうやら差分更新の時は
Patchメソッドを使うらしいのでそちらを使います。
でもPatchじゃなきゃできないわけじゃないです。

まずモデルクラスはこんな感じ

public class User
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

でクライアントはこんな感じでデータを送るとします

$("#button").on("click", function () {
  $.ajax({
    url: "http://localhost:62434/api/values",
    dataType: "json",
    method: "PATCH",
    contentType: 'application/json',
    data: JSON.stringify({Id:1, FirstName:"taro"}),
  });
});

上記の場合は、LastNameが送られてきてないので通常はnullになって更新されてしまいます。
これをちゃんとDBの値と組み合わせてnullにならないようにします。

public void Patch([FromBody]Delta<User> value)
{
  // DBから取得したとする
  var user = new User { Id = 1, FirstName = "jiro", LastName = "suzuki" };
  value.Patch(user);
}

Deltaクラスを使うと差分でデータバインドすることができます。
この場合は、FirstNameが"taro"でLastNameは"suzuki"のままです。
もちろんクライアントがFirstNameをnullで送ればそのままnullで更新ができます。

Deltaクラスは、System.Web.Http.ODataに定義されているのでNuGetで取得してください。