Привязка DateTime к модели нокаута с использованием JavaScriptSerializer по умолчанию

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

Я обновил модель подарков в стихах 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

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

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

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

Здесь приведен код обновленной версии Steve Sanderson koListEditor:

Код на моем skydrive

Спасибо

Dave

Ответ 1

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

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

Ответ 2

Не изящное решение, но оно работает:

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

Eval может быть проблемой безопасности здесь в зависимости от контекста.