2011-01-25 1 views
11

Я только начал использовать knockout, и у меня возникают проблемы с сериализацией и десериализацией DateTime с использованием JavaScriptSerializer.привязка DateTime к модели с нокаутом с использованием JavaScriptSerializer по умолчанию

Я обновил модель подарки в Steves koListEditor пример из своего блога, чтобы включать в себя модифицированную DateTime поле:

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

Тогда я обновил index.aspx включить новое поле:

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

Однако когда JavaScriptSerializer сериализует Модель

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

Модифицированная дата выходит так:

DateTime problem

Также при использовании UK Даты Т.е. 25/01/2011 JavaScriptSerializer.Deserialize бросает следующее исключение:

25/01/2011 не является допустимым значением для DateTime.

Хотя я имею 2 проблемы здесь главный вопрос кто-нибудь успешно используется knockout от MVC 2 и получил JavaScriptSerializer работать с DateTimes? Я понимаю, что я мог бы написать мой собственный JavaScriptSerializer, но я надеялся, что там был готовый раствор там :)

Вот код для обновленной версии koListEditor Стив Сандерсон:

Code on my skydrive

Благодаря

Dave

+0

Любой, кто смотрит на выше .. вы можете использовать JSON.net для отправки дат клиенту в любом формате, который вы хотите. См. Http://james.newtonking.com/archive/2009/02/20/good -date-times-with-json-net.aspx – CraftyFella

ответ

18

Хорошо, есть два варианта. Вы можете сделать простое исправление, имея назначенный объект модели просмотра, который сохраняет значения времени форматированной даты в виде строки. Обычно это то, что я делаю. Затем я могу попытаться найти значение даты для проверки.

Другой вариант заключается в реализации пользовательской привязки данных. Вы можете посмотреть на это here. Это будет более элегантный подход. Хорошая вещь об этом apporach, вы можете затем создать код создания пользовательского интерфейса при привязке, что позволит вам добавить в программу процесс выбора даты.

+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

Смежные вопросы