2012-04-25 21 views
8

web apiとdbContextを使用してasp.net mvc 3で単純なtodoリストアプリケーションを作成しました。 (バックボーンとクライアントのためのrequirejs) すべてうまく動作しますが、私は、完了したようにtodo項目をチェックするかチェックを外すと、モデル全体をサーバに送信しなければならないという事実に悩まされます。 データを送信する際に「完了」フィールドのみを送信したいと思います。asp.net web apiで部分的に更新

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

現在、このモデルに

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

を更新するために、私のAPIコントローラ方式であることがコースオフ、これは動作しますが、それはモデル全体を更新している

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

JSONデータとしてこれを取る、それがなければなりません1フィールドのみを更新します。 変更されたフィールドだけをブラウザからサーバーに送信することはできますが、Web APIメソッドの外観はわかりません。 私はFormCollectionで何かをすることを考えていましたが、提出されたformvaluesをFormCollectionタイプに直接シリアル化しようとしているように見えるため、Web APIで動作しないようです。

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

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

答えて

2

一つのアプローチはと呼ばれるツールを使用することです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); 
もう一つの提案は more appropriate to partial updates of resources according to RESTあるPATCH代わりのPUTを使用することです。

+3

これには販売されていません。フィールドをnullに設定するとどうなりますか? –

+2

null値が送信者によって設定されたのか、フィールドが省略されただけで設定されたのかを知ることはできません。この場合は、代わりにPATCH動詞を使用することをお勧めします。 – elolos

-3

あなたは、データベースから元のオブジェクトを照会する必要があり、&コール_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

+7

これは質問に答えません –

関連する問題