デフォルトのJavaScriptSerializerを使用したDateTimeへのバインディングビューモデル
-
24-10-2019 - |
質問
使い始めたばかりです ノックアウト そして、私はJavaScriptSerializerを使用して、DateTimeのシリアル化と脱皮化に悩まされています。
Stevesでギフトモデルを更新しました Kolisteditor 修正されたデータタイムフィールドを含めるための彼のブログの例:
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>
ただし、JavaScriptSerializerがモデルをシリアル化する場合
var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>;
変更された日付は次のように出てきています:
また、英国の日付を使用する場合、IE 25/01/2011はjavascriptserializer.deserializeで次の例外をスローします。
25/01/2011は、DateTimeの有効な値ではありません。
ここでは2つの問題がありますが、主な質問は誰もが正常に使用されていることです ノックアウト MVC 2から、JavaScriptSerializerがDateTimesで動作するようにしましたか?私は自分のjavascriptserializerを書くことができることに気づきましたが、そこにすぐに作られた解決策があることを望んでいました:)
Steve SandersonのKolisteditorの更新バージョンのコードは次のとおりです。
ありがとう
デイブ
解決
さて、2つのオプションがあります。事前に形成された日付時間値を文字列として保存する指定されたビューモデルオブジェクトを使用することにより、簡単な修正を行うことができます。これは一般的に私がしていることです。その後、検証の日付値を試してみることができます。
もう1つのオプションは、カスタムデータバインディングを実装することです。あなたはそれをすることを見ることができます ここ. 。これは、よりエレガントなアプローチになります。このApporachの良いところは、バインディングでUI生成コードを作成して、プロセスでUIに日付ピッカーを追加できるようにすることができます。
他のヒント
エレガントなソリューションではありませんが、それは機能します:
data-bind="value: eval('new ' + Modified.slice(1,-1)), uniqueName: true"
Eval
ここでは、コンテキストに応じてセキュリティの問題である可能性があります。