12

ノックアウトを使い始めたばかりですが、JavaScriptSerializerを使用したDateTimeのシリアル化と逆シリアル化で問題が発生しています。

Steves koListEditorの例のギフトモデルを彼のブログから更新して、ModifiedDateTimeフィールドを追加しました。

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、つまり2011年1月25日を使用する場合、JavaScriptSerializer.Deserializeは次の例外をスローします。

2011年1月25日はDateTimeの有効な値ではありません。

ここで2つの問題が発生していますが、主な質問は、MVC 2からのノックアウトを正常に使用し、JavaScriptSerializerをDateTimesで動作させることができるかどうかです。私は自分のJavaScriptSerializerを書くことができることに気づきましたが、そこに既製のソリューションがあることを望んでいました:)

スティーブサンダーソンのkoListEditorの更新バージョンのコードは次のとおりです。

スカイドライブのコード

ありがとう

デイブ

4

2 に答える 2

18

さて2つのオプションがあります。事前にフォーマットされた日時の値を文字列として格納する指定されたビューモデルオブジェクトを使用することで、簡単な修正を行うことができます。これは一般的に私がしていることです。次に、検証のために日付値を試してみることができます。

もう1つのオプションは、カスタムデータバインディングを実装することです。あなたはここでそれをするのを見ることができます。これは、よりエレガントなアプローチになります。このアプローチの良いところは、バインディングで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 に答える