C# ViewModels和KnockoutJS

C# ViewModels和KnockoutJS,c#,asp.net-mvc,mvvm,knockout.js,C#,Asp.net Mvc,Mvvm,Knockout.js,我正在构建一个ASP.NET MVC应用程序,它利用了使用AutoMapper的ViewModels。然而,我曾考虑将KnockoutJS用于“AJAX重”页面,但这意味着我还必须为KnockoutJS创建ViewModels 我能想到的两个独立视图模型的主要缺点是可维护性。有比创建两个ViewModel更好的解决方案吗?此外,阅读其他一些文章意味着客户端ViewModel必须了解服务器端,这是一种不好的做法,并将两者紧密结合在一起 我必须承认,我过去没有真正使用过KnockoutJS,但我已经

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

我能想到的两个独立视图模型的主要缺点是可维护性。有比创建两个ViewModel更好的解决方案吗?此外,阅读其他一些文章意味着客户端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>
@model视图模型
...
函数视图模型(initData){
var self=这个;
fromJS(initData,{},self);
//添加自定义视图模型逻辑
...
//将模型的当前状态持久化回服务器的逻辑
self.Save=function(){
$.ajax(“/model uri”{
键入:“POST”,
contentType:“应用程序/json”,
数据:ko.toJSON(self)
});
};
var initialData=@(Html.Raw(JsonConvert.SerializeObject(Model));
var模型=新视图模型(初始数据);
ko.应用绑定(模型);

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

您认为为什么我们当前的ViewModels不能与KnockoutJS一起使用?我认为我必须为ASP.NET MVC创建一个ViewModel,但也必须在JS中为KnockoutJS创建一个ViewModel?但正如@twoflower在下面建议的那样,我可以消除这种重复性。实际上,在与KO一起使用时,您通常不需要MVC视图模型,您可以直接使用域实体有了@Anders,但这就引出了一个问题,即相同的控制器可以与KO一起工作,而有些控制器不能。我不想完全KOify我的Web应用程序,但只想让AJAX重的页面,因此我想保持所有内容的一致性。例如,有一个ASP.NET模型可以“映射”到KO ViewModel,然后对KO执行我需要的操作。谢谢!我也会尝试一下但是,ASP.NET ViewModels的数据属性和验证会发生什么情况?如果您将客户端发送的数据作为服务器端ViewModel对象接收,则服务器端验证将起作用。我认为,使用KO时客户端验证将不起作用,因此我必须在自定义视图模式下实现l logic?可能使用敲除验证之类的框架?如果我得到正确的答案,它将看起来像://添加自定义视图模型逻辑:personName:ko.observable(initData.personName).extend({required:true});是的,这是正确的,您必须提供客户端验证逻辑。不过,我不熟悉敲除验证。哎呀,我刚刚注意到我的回答中遗漏了一个非常重要的部分-使用
ko.mapping.fromJS
来实际观察模型的属性。