c# with asp.net Web API を使用した部分的な更新




using web api with asp net web forms (2)

データベースから元のオブジェクトを照会し、プロパティを設定して_db.SaveChange()を呼び出す必要があります。

public HttpResponseMessage Put(Todo todo){
var item = _db.Todo.First(i => i.id = todo.id);
item.Content = todo.Content;
item.Done = todo.Done;
_db.SaveChanges();
return new HttpResponseMessage<Todo>(HttpStatusCode.Accepted);
}

Ref .: http://msdn.microsoft.com/en-us/library/dd456854.aspx

私はweb apiとdbContextを使ってasp.net mvc 3に簡単なtodoリストアプリケーションを作成しました。 (バックボーンとクライアントのためのrequirejsと)すべてうまく動作しますが、私はチェックしたり、完了しているようにtodo項目のチェックを外す場合、私はサーバーにモデル全体を送信する必要があるという事実に悩まされています。 私はデータを提出するときに "完了"フィールドを送信したいと思います。

私は、JSON.NETをデフォルトのシリアライザとして使用するためにJsonNetFormatterも使用していることに言及する必要があります(ここで説明します: http ://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json- net-with-asp-net-web-api.aspx )。

現在、これはモデルを更新するための私のAPIコントローラメソッドです

public HttpResponseMessage Put(Todo todo)
{
    _db.Entry(todo).State = EntityState.Modified;
    _db.SaveChanges();
    return new HttpResponseMessage(HttpStatusCode.NoContent);
}

それはこれをjsonデータとして取ります

{"content":"Pick up milk","done":false,"id":10}

もちろん、これは機能しますが、モデル全体を更新しているため、1つのフィールドのみを更新する必要があります。 変更されたフィールドだけをブラウザからサーバーに送信することはできますが、Web APIのメソッドがどのように表示されるかわかりません。 私はFormCollectionで何かをすることを考えていましたが、FormCollectionの型に直接送信されたformvaluesをシリアル化しようとしているように見えるので、Web APIで動作しないようです。

Cannot deserialize JSON object (i.e. {"name":"value"}) into type 'System.Web.Mvc.FormCollection'.

モデルからWeb APIに1つ以上のフィールドの部分的な更新を送信するにはどうすればよいですか? 私は、更新されたフィールドをサーバーに送信し、そこからデータベースへのフィールドのみを更新するだけです。 私は確かに更新する前にデータベースを照会したくありません。


1つのアプローチは、 Automapperというツールを使用して、Todoオブジェクトをマッピングするときにnull値が既存の値を上書きしないように構成することです。 例えば:

  Mapper.CreateMap<Todo,Todo>()
        .ForMember(d => d.Id, o => o.Ignore())
        .ForAllMembers(mo => mo.Condition(cond => !cond.IsSourceValueNull));  

次に、受け取ったオブジェクトの値を既存のものにマップするだけです。

  Mapper.Map(todo, item);

もう1つの提案は、PUTの代わりにPATCHを使用することです.PUTは、RESTに従ったリソースの部分的更新に適しています







asp.net-web-api