2011-01-25 42 views
11

Tôi vừa mới bắt đầu sử dụng knockout và tôi đang gặp sự cố với tính năng SerialTime serialization và Deserialization sử dụng JavaScriptSerializer.Thời gian ràng buộc ràng buộc để loại bỏ chế độ xem với JavaScriptSerializer mặc định

Tôi đã cập nhật mô hình quà tặng trong Steves koListEditor ví dụ từ blog của mình để bao gồm một lĩnh vực DateTime Modified:

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

Sau đó, tôi được cập nhật các index.aspx để bao gồm các lĩnh vực mới:

<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> 

Tuy nhiên, khi JavaScriptSerializer nối tiếp Mô hình

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

các Date Modified là sắp ra như thế này:

DateTime problem

Ngoài ra khi sử dụng Anh Ngày Tức là 25/01/2011 các JavaScriptSerializer.Deserialize ném ngoại lệ sau đây:

25/01/2011 không phải là một giá trị hợp lệ cho DateTime.

Mặc dù tôi có 2 vấn đề ở đây câu hỏi chính là có ai đã sử dụng thành công knockout từ MVC 2 và nhận JavaScriptSerializer làm việc với DateTimes không? Tôi nhận ra tôi có thể viết JavaScriptSerializer của riêng tôi nhưng tôi đã hy vọng có được một giải pháp làm sẵn ngoài kia :)

Dưới đây là đoạn code cho các phiên bản cập nhật của koListEditor Steve Sanderson của:

Code on my skydrive

Cảm ơn

Dave

+0

Bất cứ ai nhìn vào ở trên .. bạn có thể sử dụng JSON.net để gửi ngày cho khách hàng theo định dạng bạn muốn bao giờ .. xem http://james.newtonking.com/archive/2009/02/20/good -date-times-with-json-net.aspx – CraftyFella

Trả lời

18

Cũng có hai tùy chọn. Bạn có thể thực hiện sửa lỗi đơn giản bằng cách có một đối tượng mô hình khung được chỉ định để lưu trữ các giá trị thời gian ngày được định dạng trước thành một chuỗi. Đây thường là những gì tôi làm. Sau đó tôi có thể dùng thử cho giá trị ngày để xác thực.

Tùy chọn khác sẽ là triển khai ràng buộc dữ liệu tùy chỉnh. Bạn có thể xem xét việc đó here. Đây sẽ là cách tiếp cận thanh lịch hơn. Điều tuyệt vời về apporach này, bạn có thể tạo mã tạo mã UI cho phép bạn thêm bộ chọn ngày vào ui trong tiến trình.

+1

Đẹp dude .. như cách tiếp cận ràng buộc tùy chỉnh ...Giống như tôi đã nói với dude khác .. cuối cùng tôi tìm thấy JSON.net là sửa chữa dễ dàng nhất .. vì nó cho phép chúng tôi gửi các ngày xuống cho khách hàng trong những gì đã bao giờ định dạng chúng tôi muốn .. – CraftyFella

+0

Vâng, một fan hâm mộ lớn của cách tiếp cận ràng buộc tùy chỉnh. Hy vọng rằng tôi không lạm dụng nó trong dự án của tôi, nhưng nó làm cho HTML trở nên sạch sẽ. –

+1

[Ví dụ về trình xử lý ràng buộc tùy chỉnh cho các ngày] (http://everythingjs.blogspot.fr/2012/03/json-dates-and-knockoutjs-date-binding.html) – chrisb

1

Không phải là giải pháp tao nhã, nhưng nó hoạt động:

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

Eval có thể là sự cố bảo mật ở đây tùy theo ngữ cảnh.

+1

Tôi đã tìm thấy một giải pháp cuối cùng .. Tôi đã sử dụng JSON.net cho phép bạn chỉ định Định dạng ngày của riêng bạn. http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx làm việc một điều trị .. – CraftyFella

Các vấn đề liên quan