2012-04-25 23 views
8

Web api ve dbContext ile asp.net mvc 3'te basit bir yapılacaklar listesi uygulaması oluşturdum. (istemci için omurga ve requirejs ile) Her şey iyi çalışıyor, ancak yaptığım gibi bir todo öğesinin işaretini veya işaretini kaldırırsam, tüm modeli sunucuya göndermem gerektiğinden rahatsızlık duyuyorum. Veri gönderirken sadece "biten" alanını göndermek istiyorum.asp.net web api ile kısmi güncelleştirme

JSON.NET'i varsayılan Serializer olarak kullanmak için JsonNetFormatter'ı kullanıyorum (burada açıklanmaktadır: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx). olması gerektiği,

Şu anda bu O

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

Kapalı Tabii bu işleri json veri olarak bu alan modeli

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

güncellemek için benim API kontrolör yöntemdir, ancak bütün modelin güncelliyor sadece 1 alanı güncelle. Sadece değiştirilen alanları tarayıcıdan sunucuya gönderebilirim ancak web api yönteminin nasıl görüneceğinden emin değilim. FormCollection ile bir şeyler yapmayı düşünüyordum, ancak bu form formları doğrudan FormCollection türüne serileştirmeye çalışıyormuş gibi görünen web api ile çalışmıyor gibi görünüyor, bu hatayı alıyorum.

Modelden bir veya daha fazla alan için kısmi bir güncelleştirmeyi web api'mden nasıl gönderebilirim? Sadece güncellenmiş alanları sunucuya göndermek istiyorum ve oradan sadece bu alanları veritabanına güncellemek istiyorum. Kesinlikle veritabanını güncellemeden önce sorgulamak istemiyorum. Sen veritabanından orijinal nesneyi sorgulamak gerekir

cevap

2

Bir yaklaşım denilen bir aracı kullanmak olacaktır Automapper ve onu yapılandırın, böylece sıfır değerleri, Todo nesnelerini eşlerken varolanların üzerine yazmaz. Örneğin:

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

Sonra aynen böyle, mevcut birine alınan nesne değeri harita olurdu:

Mapper.Map(todo, item); 

Başka bir öneri yerine more appropriate to partial updates of resources according to REST olan PUT PATCH'in kullanmak olacaktır.

+3

numaralı soruya yanıt vermiyor. Bir alanı null olarak ayarlamak isterseniz? –

+2

Sıfır değerinin gönderen tarafından ayarlanıp ayarlanmadığını veya bir alanın atlanmasıyla ayarlanmış olup olmadığını anlayamazsınız. Bu durumda, bunun yerine PATCH fiilini kullanmanızı tavsiye ederim. – elolos

-3

, özellikleri & çağrıyı _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 .: set http://msdn.microsoft.com/en-us/library/dd456854.aspx

+7

Bu, –