2

我正在构建一个 ASP.NET MVC 应用程序,该应用程序利用 AutoMapper 的 ViewModels。但是,我正在考虑将 KnockoutJS 用于“AJAX 重”页面,但这意味着我还必须为 KnockoutJS 创建 ViewModel。

我认为拥有两个独立 ViewModel 的主要缺点是可维护性。有比创建两个 ViewModel 更好的解决方案吗?此外,阅读其他一些帖子,这意味着客户端 ViewModel 必须了解服务器端,这是不好的做法,并且将两者紧密耦合在一起。

我必须承认我过去并没有真正使用过 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 回答