使用默认JavaScriptSerializer绑定DateTime敲除视图模型
-
24-10-2019 - |
题
我刚刚开始使用 昏死 而且,我使用JavaScriptSerializer遇到了DateTime序列化和避难所化的麻烦。
我已经更新了史蒂夫的礼物模型 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"> </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>
但是,当JavaScriptSerialializer序列时
var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>;
修改后的日期是这样的:
另外,当使用英国日期即25/01/2011 javascriptserializer.deserialize抛出以下例外:
25/01/2011不是DateTime的有效值。
尽管我在这里遇到了两个问题,但主要问题是有人成功使用了 昏死 从MVC 2中获得JavaScriptSerializer使用数据仪?我意识到我可以写自己的JavaScriptSerializer,但我希望那里有一个现成的解决方案:)
这是史蒂夫·桑德森(Steve Sanderson)的Kolisteditor的更新版本的代码:
谢谢
戴夫
解决方案
好吧,有两个选择。您可以通过拥有指定的视图模型对象来完成简单的修复,该对象将预先形成的日期时间值存储为字符串。这通常就是我要做的。然后,我可以尝试验证的日期值。
另一个选项是实现自定义数据绑定。你可以看一下 这里. 。这将是更优雅的方法。关于此Apporach的好处,您可以在绑定时创建UI生成代码,从而使您可以在此过程中将日期选择器添加到UI中。
其他提示
不是一个优雅的解决方案,但它起作用:
data-bind="value: eval('new ' + Modified.slice(1,-1)), uniqueName: true"
Eval
根据上下文,这里可能是安全问题。
不隶属于 StackOverflow