2011-01-25 6 views
11

मैं सिर्फ knockout उपयोग शुरू कर दिया है और मैं दिनांक समय क्रमबद्धता और Deserialization JavaScriptSerializer का उपयोग कर के साथ मुसीबत में चल रहा हूँ।बाइंडिंग दिनांक समय डिफ़ॉल्ट के साथ दृश्य मॉडल पीटकर करने JavaScriptSerializer

मैं अपने ब्लॉग से Steves koListEditor उदाहरण में उपहार मॉडल को नवीनीकृत किया है एक संशोधित दिनांक समय क्षेत्र शामिल करने के लिए:

<asp:Content ContentPlaceHolderID="MainContent" runat="server"> 
    <h1>Gift list editor</h1> 

    <p>You have asked for <span data-bind="text: gifts().length">&nbsp;</span> gift(s)</p> 

    <form class="giftListEditor"> 
     <table> 
      <tbody data-bind="template: { name: 'giftRowTemplate', foreach: gifts }"></tbody> 
     </table> 

     <button data-bind="click: addGift">Add Gift</button> 
     <button data-bind="enable: gifts().length > 0" type="submit">Submit</button> 
    </form> 

    <script type="text/html" id="giftRowTemplate"> 
     <tr> 
      <td>Gift name: <input class="required" data-bind="value: Title, uniqueName: true"/></td> 
      <td>Price: \$ <input class="required number" data-bind="value: Price, uniqueName: true"/></td> 
      <td>Modified: <input class="required date" data-bind="value: Modified, uniqueName: true"/></td> 
      <td><a href="#" data-bind="click: function() { viewModel.removeGift($data) }">Delete</a></td> 
     </tr> 
    </script> 

    <script type="text/javascript"> 
     var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>; 
     var viewModel = { 
      gifts : ko.observableArray(initialData), 

      addGift: function() { 
       this.gifts.push({ Title: "", Price: "", Modified:"" }); 
      }, 

      removeGift: function (gift) { 
       this.gifts.remove(gift); 
      }, 

      save: function() { 
       ko.utils.postJson(location.href, { gifts: this.gifts }); 
      } 
     }; 

     ko.applyBindings(document.body, viewModel); 
     $("form").validate({ submitHandler: function() { viewModel.save() } }); 
    </script> </asp:Content> 
:

public class GiftModel 
{ 
    public string Title { get; set; } 
    public double Price { get; set; } 
    public DateTime Modified { get; set; } 
} 

तब मैं नए क्षेत्र शामिल करने के लिए index.aspx अद्यतन

हालांकि JavaScriptSerializer serializes जब मॉडल

var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>; 

संशोधित तिथि इस तरह बाहर आ रहा है:

DateTime problem

इसके अलावा का उपयोग करते समय ब्रिटेन दिनांक अर्थात

25/01/2011 दिनांक समय के लिए मान्य मान नहीं है: 25/01/2011 JavaScriptSerializer.Deserialize निम्नलिखित अपवाद फेंकता है।

हालांकि मैं 2 समस्या आ रही है यहां मुख्य प्रश्न किसी को भी सफलतापूर्वक MVC 2 से knockout इस्तेमाल किया गया है और JavaScriptSerializer datetimes के साथ काम कर ली है? मुझे लगता है मैं अपने खुद के JavaScriptSerializer लिख सकता है, लेकिन मैं वहाँ उम्मीद कर बाहर वहाँ :)

यहाँ स्टीव सैंडरसन के koListEditor के अद्यतित संस्करण के लिए कोड है एक तैयार समाधान किया गया था:

Code on my skydrive

धन्यवाद

डेव

+0

उपरोक्त को देखने वाले कोई भी व्यक्ति .. आप JSON.net का उपयोग क्लाइंट को तारीखों को भेजने के लिए कर सकते हैं जो आप चाहते हैं कि प्रारूप में .. http://james.newtonking.com/archive/2009/02/20/good देखें -date-times-with-json-net.aspx – CraftyFella

उत्तर

18

वैसे वहाँ दो विकल्प हैं। आप नामित दृश्य मॉडल ऑब्जेक्ट के द्वारा सरल फिक्स कर सकते हैं जो पूर्व निर्धारित दिनांक समय मानों को एक स्ट्रिंग के रूप में संग्रहीत करता है। यह आमतौर पर मैं करता हूं। मैं सत्यापन के लिए दिनांक मान के लिए tryparse कर सकते हैं।

अन्य विकल्प बाध्यकारी एक कस्टम डेटा लागू करने के लिए किया जाएगा। आप here कर सकते हैं। यह अधिक सुरुचिपूर्ण दृष्टिकोण होगा। इस apporach के बारे में अच्छी बात यह है, आप तो आप यूआई पीढ़ी कोड आप इस प्रक्रिया में ui तिथि चयनकर्ता को जोड़ने की अनुमति बंधन पर बना सकते हैं।

+1

अच्छा दोस्त .. काम करता है कस्टम बाध्यकारी दृष्टिकोण की तरह ...जैसा कि मैंने दूसरे दोस्त से कहा .. अंत में मैंने पाया कि JSON.net सबसे आसान फिक्स था .. क्योंकि यह हमें क्लाइंट को तारीखों को जो भी प्रारूप चाहता था, उसे भेजने की इजाजत देता था .. – CraftyFella

+0

हाँ, एक बड़ा प्रशंसक कस्टम बाइंडिंग दृष्टिकोण। उम्मीद है कि मैं इसे अपने प्रोजेक्ट में अधिक नहीं कर रहा हूं, लेकिन यह HTML को इतना साफ बनाता है। –

+1

[तिथियों के लिए कस्टम बाध्यकारी हैंडलर का एक उदाहरण] (http://everythingjs.blogspot.fr/2012/03/json-dates-and-knockoutjs-date-binding.html) – chrisb

1

नहीं एक सुरुचिपूर्ण समाधान है, लेकिन यह काम करता है:

data-bind="value: eval('new ' + Modified.slice(1,-1)), uniqueName: true"

Eval संदर्भ के आधार पर यहां सुरक्षा की कोई समस्या हो सकती है।

+1

मुझे अंत में एक समाधान मिला .. मैंने JSON.net का उपयोग किया जो आपको अपना दिनांक प्रारूप निर्दिष्ट करने की अनुमति देता है। http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx इलाज .. – CraftyFella

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