使用默认JavaScriptSerializer绑定DateTime以敲除视图模型

前端之家收集整理的这篇文章主要介绍了使用默认JavaScriptSerializer绑定DateTime以敲除视图模型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚开始使用 knockout,我遇到了使用JavaScriptSerializer的DateTime序列化和反序列化的麻烦.

我已经从他的博客更新了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) %>;

修改日期如下:

当使用英国日期I.e 25/01/2011 JavaScriptSerializer.Deserialize抛出以下异常:

25/01/2011 is not a valid value for
DateTime.

虽然我有两个问题在这里主要的问题是有人成功地从MVC 2使用knockout,并得到JavaScriptSerializer与DateTimes工作?我知道我可以编写自己的JavaScriptSerializer,但我希望有一个现成的解决方案在那里:)

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

Code on my skydrive

谢谢

戴夫

解决方法

那有两个选择.您可以通过具有将预定格式的日期时间值作为字符串存储的指定视图模型对象来进行简单的修复.这通常是我做的然后我可以对日期值进行tryparse验证.

另一个选择是实现自定义数据绑定.你可以看看这个here.这将是更优雅的方法.关于这个apporach的好东西,你可以在绑定上创建UI生成代码,使你可以在进程中添加日期选择器到ui.

猜你在找的JavaScript相关文章