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

StackOverflow https://stackoverflow.com/questions/4798502

Вопрос

Я только начал использовать выбить И я сталкиваюсь с проблемами с сериализацией и десериализацией 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

Также при использовании британских дат, т. Е. 25/01/2011 The Javascriptserializer.Deserialize бросает следующее исключение:

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

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

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

Код на моем SkyDrive

Спасибо

Дэйв

Это было полезно?

Решение

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

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

Другие советы

Не элегантное решение, но оно работает:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top