12

我刚刚开始使用淘汰赛,并且在使用 JavaScriptSerializer 的 DateTime 序列化和反序列化方面遇到了麻烦。

我已经从他的博客更新了 Steves koListEditor示例中的礼物模型,以包含一个 Modified 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) %>;

修改日期是这样出来的:

日期时间问题

此外,当使用 UK Dates Ie 25/01/2011 时,JavaScriptSerializer.Deserialize 会引发以下异常:

25/01/2011 不是 DateTime 的有效值。

虽然我在这里遇到了 2 个问题,但主要问题是有没有人成功使用MVC 2 的淘汰赛并让 JavaScriptSerializer 与 DateTimes 一起工作?我意识到我可以编写自己的 JavaScriptSerializer,但我希望那里有现成的解决方案 :)

以下是 Steve Sanderson 的 koListEditor 更新版本的代码:

我的 Skydrive 上的代码

谢谢

戴夫

4

2 回答 2

18

那么有两个选择。您可以通过指定的视图模型对象来完成简单的修复,该对象将预先格式化的日期时间值存储为字符串。这通常是我所做的。然后我可以尝试解析日期值以进行验证。

另一种选择是实现自定义数据绑定。你可以看看这样做here。这将是更优雅的方法。这个方法的好处是,您可以在绑定时创建 UI 生成代码,允许您在此过程中将日期选择器添加到 ui。

于 2011-02-23T03:53:31.913 回答
1

不是一个优雅的解决方案,但它有效:

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

Eval根据上下文,这里可能是一个安全问题。

于 2011-02-10T02:21:41.113 回答