2011-08-02 11 views
12

क्या पीओसीओ और नॉकआउटज को देखने के लिए कोई तरीका है?नॉकआउटजे मैपिंग से/पीओसीओ ऑब्जेक्ट

मैं एक नोट वर्ग है:

public class Note 
{ 
    public int ID { get; set; } 
    public string Date { get; set; } 
    public string Content { get; set; } 
    public string Category { get; set; } 
    public string Background { get; set; } 
    public string Color { get; set; } 
} 

और यह मेरा जावास्क्रिप्ट है:

$(function() { 
    ko.applyBindings(new viewModel()); 
}); 

function note(date, content, category, color, background) { 
    this.date = date; 
    this.content = content; 
    this.category = category; 
    this.color = color; 
    this.background = background; 
} 

function viewModel() { 
    this.notes = ko.observableArray([]); 
    this.newNoteContent = ko.observable(); 

    this.save = function (note) { 
     $.ajax({ 
       url: '@Url.Action("AddNote")', 
       data: ko.toJSON({ nota: note }), 
       type: "post", 
       contentType: "json", 
       success: function(result) { } 

      }); 
    } 

    var self = this; 
    $.ajax({ 
     url: '@Url.Action("GetNotes")', 
     type: "get", 
     contentType: "json", 
     async: false, 
     success: function (data) { 
      var mappedNotes = $.map(data, function (item) { 
       return new note(item.Date, item.Content, item.Category, item.Color, item.Background); 
      }); 
      self.notes(mappedNotes); 
     } 
    }); 
} 

तथ्य यह है कि समारोह को बचाने नहीं किया जाता है (यहाँ कोड को आसान बनाने के) पर ध्यान न दें।

इसलिए, जब मैं पृष्ठ लोड करता हूं तो मैं सर्वर को कॉल करता हूं और मैं नोट ऑब्जेक्ट्स की एक सूची पुनर्प्राप्त करता हूं और मैं इसे जावास्क्रिप्ट में मैप करता हूं। ध्यान दें कि आईडी कैसे मैप नहीं की गई है क्योंकि मुझे इसे मेरे विचार में नहीं चाहिए।

अभी तक इतना अच्छा है, मैं स्क्रीन पर नोट्स देखता हूं, लेकिन मैं सर्वर पर नोट्स को कैसे सहेज सकता हूं?

मैंने नोट को परिवर्तित करने की कोशिश की (मैं केवल नया नोट सहेज रहा हूं और पूरे संग्रह नहीं) JSON को भेजता हूं और इसे अपने नियंत्रक को भेजता हूं लेकिन मुझे नहीं पता कि नियंत्रक में नोट तक कैसे पहुंचना है। मैंने कोशिश की:

public string AddNote(string date, string content, string category, string background, string color) 
    { 
     // TODO 
    } 

लेकिन काम नहीं कर रहा है। मैं कुछ ऐसा करना चाहते हैं:

public string AddNote(Note note) {} 

, (Btw, क्या एक विधि है कि बस डीबी पर डेटा सहेजने के लिए सबसे ज़्यादा लाभ है शून्य?)

तो मैं यह करने के लिए कैसे? मैंने knockout.mapping प्लगइन की कोशिश की लेकिन यह काफी भ्रमित है और मुझे यह मेरे लिए काम नहीं मिल रहा है।

धन्यवाद।

उत्तर

24

एएसपी.नेट एमवीसी का मॉडल बाइंडर उन गुणों की तलाश करेगा जो केस-संवेदी हैं। आपको अपने JSON ऑब्जेक्ट को वापस अपने पॉको ऑब्जेक्ट से मेल खाने वाले संपत्ति नामों के साथ सर्वर पर पास करने की आवश्यकता है।

मैं आमतौर पर 2 में से 1 बातें करते हैं:

  1. मेरी जावास्क्रिप्ट वस्तु संपत्ति के नाम राजधानी बनाओ (जे एस में उस तरह से, मुझे पता है कि इस वस्तु कुछ बिंदु पर सर्वर के लिए एक डीटीओ हो जाएगा)

    function Note(date, content, category, color, background) { 
        this.Date = date; 
        this.Content = content; 
        this.Category = category; 
        this.Color = color; 
        this.Background = background; 
    }; 
    
  2. मेरी AJAX कॉल में मैं सिर्फ सर्वर पर पारित करने के लिए (ध्यान दें कि यह आवश्यकता नहीं है ko.toJSON) एक गुमनाम वस्तु बना देगा:

    $.ajax({ 
         url: '@Url.Action("AddNote")', 
         data: JSON.stringify({ note: { 
           Date: note.date, 
           Content: note.content, 
           Category: note.category, 
           Color: note.color, 
           Background: note.background 
           } 
          }), 
         type: "post", 
         contentType: "application/json; charset=utf-8", 
         success: function(result) { } 
    }); 
    
    ,210

    (ध्यान दें विभिन्न contentType पैरामीटर के रूप में अच्छी तरह से)

आप अपने ActionMethod एक (Note note) में लेने के लिए और न सिर्फ मानकों की सरणी बनाने के लिए चाहते हैं।

इसके अलावा, क्योंकि मॉडलबिंडर पोस्ट मानों को दो अलग-अलग तरीकों से देखते हैं। के बजाय:: मैं भाग्य बाहर ActionMethod पैरामीटर नाम निर्दिष्ट करने के साथ JSON ऑब्जेक्ट पोस्टिंग लिया है

{ note: { 
     Date: note.date, 
     Content: note.content, 
     Category: note.category, 
     Color: note.color, 
     Background: note.background 
     } 
    } 

सिर्फ कार्य करें:

{ 
     Date: note.date, 
     Content: note.content, 
     Category: note.category, 
     Color: note.color, 
     Background: note.background 
    } 

(लेकिन इस सरणियों संग्रह और जटिल के लिए बाध्य के साथ dicey प्राप्त कर सकते हैं प्रकार ... आदि)

एक डीबी कॉल करने वाली विधि पर वापसी के लिए 'सर्वश्रेष्ठ' हस्ताक्षर तक, हम आम तौर पर बूलियन देखना पसंद करते हैं, लेकिन यह आपकी आवश्यकताओं पर भी निर्भर करता है। जाहिर है कि यह मामूली डेटा है, शून्य ठीक होगा, लेकिन यदि यह थोड़ा अधिक महत्वपूर्ण है, तो आप अपने ग्राहक को यह जानने के लिए एक बूलियन (कम से कम) रिले करना चाह सकते हैं कि इसे पुनः प्रयास करने की आवश्यकता हो सकती है (विशेष रूप से यदि कोई सहमति अपवाद हो) ।

यदि आपको वास्तव में अपने ग्राहक को यह पता होना चाहिए कि डेटाबेस में क्या हुआ है, तो आप custom error handling और exception catching की दुनिया में जा सकते हैं।

इसके अलावा, यदि आपको सफल/असफल डेटाबेस प्रतिबद्धता के आधार पर अपने उपयोगकर्ता को बहुत विशिष्ट जानकारी प्रदर्शित करने की आवश्यकता है, तो आप डेटाबेस लेनदेन में जो हुआ उसके आधार पर कुछ दृश्यों पर रीडायरेक्ट करते हुए custom ActionResults बनाने पर विचार कर सकते हैं।

अन्त में, जहाँ तक डेटा सर्वर से वापस हो रही है और नॉकआउट का उपयोग कर ... के रूप में

  1. फिर मानचित्रण प्लगइन अगर अपनी संपत्ति के नाम इसी मामले हैं या आप एक से थोड़ा अधिक स्पष्ट मानचित्रण नहीं बना काम करेंगे
  2. मेरी जेएस वस्तुओं के साथ मेरी अपनी चाल नीचे है। प्रारंभिक कार्य कुछ ऐसा है जो मैंने बनाया है जो आपके सभी ऑब्जेक्ट्स पर पुन: प्रयोज्य होना चाहिए क्योंकि यह कहता है "अगर संपत्ति के नाम मिलते हैं (कम किए जाने के बाद), तो उन्हें फ़ंक्शन (नॉकआउट संगत) कॉल करके सेट करें या केवल मान निर्दिष्ट करें .:

    function Note(values){ //values are what just came back from the server 
        this.date; 
        this.content; 
        this.category; 
        this.color; 
        this.background; 
    
        initialize(values); //call the prototyped function at the bottom of the constructor 
    }; 
    
    Note.prototype.initialize = function(values){ 
        var entity = this; //so we don't get confused 
         var prop = ''; 
         if (values) { 
          for (prop in values) { 
           if (values.hasOwnProperty(prop.toLowerCase()) && entity.hasOwnProperty(prop.toLowerCase())) { 
            //the setter should have the same name as the property on the values object 
    
            if (typeof (entity[prop]) === 'function') { 
             entity[prop](values[prop]); // we are assuming that the setter only takes one param like a Knockout observable() 
            } else {// if its not a function, then we will just set the value and overwrite whatever it was previously 
             entity[prop] = values[prop]; 
            } 
           } 
          } 
         } 
    }; 
    
+1

बहुत बढ़िया महाकाव्य जवाब यह सही काम करता है लेकिन: क्या आप मुझे अंतिम अनुच्छेद की व्याख्या कर सकते और .. कैसे सर्वर से लोड करने के लिए मैनुअल मानचित्रण इम यहां क्या कर के रूप में या मैं मानचित्रण प्लगइन की कोशिश करने के लिए है?? –

+1

हाँ, महान उत्तर के लिए +1। यह उत्कृष्ट उदाहरणों के साथ बहुत स्पष्ट है। –

+0

वाह - बढ़िया काम। –

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