2

AutoMapper を使用して ViewModels を利用する ASP.NET MVC アプリケーションを構築しています。ただし、「AJAX が重い」ページに KnockoutJS を使用することを考えていましたが、それは KnockoutJS 用の ViewModel も作成する必要があることを意味します。

2 つの別個の ViewModel を持つことの主な欠点は、保守性です。2 つの ViewModel を作成するよりも良い解決策はありますか? また、他のいくつかの投稿を読むと、これは、クライアント側の ViewModel がサーバー側を認識する必要があることを意味します。これは悪い習慣であり、2 つを緊密に結合します。

私は過去に KnockoutJS を実際に使用したことがないことを認めなければなりませんが、いくつかのチュートリアルを読んだり行ったりしたので、この問題については少し不可知論者です。どんな助けでも大歓迎です。

4

1 に答える 1

3

二重性は、次のアプローチによって大幅に削減できます。

@model ViewModel

<script src="@Url.Content("~/Scripts/knockout.mapping-latest.js")" type="text/javascript"></script>

...

<script type="text/javascript">
    function ViewModel(initData) {
        var self = this;
        ko.mapping.fromJS(initData, {}, self);

        // Add custom view model logic
        ...

        // Logic for persisting the current state of the model back to the server
        self.Save = function() {                
            $.ajax('/model-uri', {
              type: 'POST',
              contentType: "application/json",
              data: ko.toJSON(self)                  
         });
    };

    var initialData = @(Html.Raw(JsonConvert.SerializeObject(Model)));
    var model = new ViewModel(initialData);
    ko.applyBindings(model);
</script>

サーバー提供のビュー モデルを JavaScript オブジェクトにシリアル化し、プラグインを使用してそのプロパティを監視可能にすることに注意してください。ko.mappingこれにより、クライアント側でビュー モデル定義を複製する必要がなくなります。ko.toJSON更新されたモデルをサーバーに送り返す際にも、ユーティリティ関数を使用します。

于 2013-11-04T10:44:52.307 に答える