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

我可以想到拥有两个单独的ViewModel的主要缺点是可维护性。有没有比创建两个ViewModels更好的解决方案?同样,阅读其他几篇文章也意味着客户端ViewModel必须注意服务器端这是不好的做法,并将两者紧密地结合在一起。

我必须承认,我过去从未真正使用过KnockoutJS,但是已经阅读/阅读了一些教程,所以我对此事有点怀疑。任何帮助,将不胜感激。

最佳答案

可以通过以下方法在很大程度上减少重复性:

@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>

请注意,我们正在将服务器提供的 View 模型序列化为JavaScript对象,然后使用 ko.mapping 插件使其可观察到的属性,这节省了我们在客户端复制 View 模型的定义。将更新的模型发送回服务器时,我们还使用ko.toJSON实用程序功能。

10-07 18:51