2012-04-25 15 views
8

के साथ आंशिक अपडेट मैंने वेब एपीआई और डीबीकॉन्टेक्स्ट के साथ एएसपीएनटी एमवीसी 3 में एक साधारण टोडो सूची एप्लिकेशन बनाया। (क्लाइंट के लिए रीढ़ की हड्डी और requjs के साथ) सब कुछ ठीक काम करता है, लेकिन मैं इस तथ्य से परेशान हूं कि मुझे पूरे मॉडल को सर्वर पर भेजना है यदि मैं एक कार्य आइटम को चेक या अनचेक करता हूं। मैं डेटा सबमिट करते समय केवल "किया गया" फ़ील्ड भेजना चाहता हूं।एएसपीनेट वेब एपीआई

मुझे यह उल्लेख करना चाहिए कि मैं JSON.NET का उपयोग डिफ़ॉल्ट Serializer के रूप में JSON.NET का उपयोग करने के लिए भी कर रहा हूं (यहां बताया गया है: 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); 
} 

मेरी एपीआई नियंत्रक तरीका है यह json डेटा

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

जरुर इस काम करता है के रूप में इस लेता है, लेकिन यह पूरे मॉडल अपडेट कर रहा है, यह होना चाहिए केवल 1 फ़ील्ड अपडेट करें। मैं केवल ब्राउज़र से बदलकर फ़ील्ड को सर्वर से भेजने के लिए प्राप्त कर सकता हूं, लेकिन मुझे यकीन नहीं है कि वेब एपीआई विधि कैसा दिखना चाहिए। मैं फॉर्मकॉलेक्शन के साथ कुछ करने के बारे में सोच रहा था लेकिन ऐसा लगता है कि यह वेब एपीआई के साथ काम नहीं कर रहा है क्योंकि ऐसा प्रतीत होता है कि सबमिट किए गए फॉर्मूले को फॉर्मक्लॉक्शन प्रकार पर सीधे क्रमबद्ध करने की कोशिश की जा रही है, मुझे यह त्रुटि मिलती है।

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

मैं मॉडल से अपने वेब एपीआई में 1 या अधिक फ़ील्ड के लिए आंशिक अद्यतन कैसे भेज सकता हूं? मैं केवल अद्यतन फ़ील्ड को सर्वर पर भेजना चाहता हूं, और वहां से केवल उन फ़ील्ड को डेटाबेस में अपडेट करें। मैं निश्चित रूप से अद्यतन करने से पहले डेटाबेस से पूछना नहीं चाहता हूं।

उत्तर

2

एक दृष्टिकोण के लिए एक उपकरण कहा जाता है का उपयोग किया जाएगा Automapper और इसे कॉन्फ़िगर करें ताकि टोड ऑब्जेक्ट्स मैप करते समय शून्य मान मौजूदा लोगों को ओवरराइट न करें। उदाहरण के लिए:

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

तो फिर तुम सिर्फ इस तरह, मौजूदा प्राप्त वस्तु मान मैप करने के लिए होगा:

Mapper.Map(todo, item); 

एक और सुझाव PUT जो more appropriate to partial updates of resources according to REST है के बजाय PATCH उपयोग करने के लिए किया जाएगा।

+3

पर सवाल नहीं उठाता है इस पर बेचा नहीं गया। क्या होगा यदि आप एक फ़ील्ड को शून्य पर सेट करना चाहते हैं? –

+2

आप यह बताने में सक्षम नहीं होंगे कि प्रेषक द्वारा शून्य मूल्य निर्धारित किया गया था या केवल इस तथ्य से निर्धारित किया गया था कि एक फ़ील्ड छोड़ा गया था। इस मामले में, मैं इसके बजाय पैच क्रिया का उपयोग करने की सिफारिश करता हूं। – 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); 
} 

रेफरी .: सेट उसके गुण http://msdn.microsoft.com/en-us/library/dd456854.aspx

+7

यह –

संबंधित मुद्दे