2012-06-02 32 views
11

我目前正在研究ASP.NET MVC解决方案,并且最近引入了Knockout(一个MVVM JS库)和Wijmo(一组jQuery UI小部件)。如何在ASP.NET MVC项目中为knockout生成客户端视图模型?

随着Knockout的推出,我还需要在客户端有模型,所以为此我序列化C#ViewModel并使用data-model="@Model.ToJson()"将其附加到视图。这使我可以从JS中检索模型,并将一些客户端的爱应用于一切。

但是,敲除需要一切都是可观察的,所以我需要声明一个单独的客户端ViewModel并映射数据模型对象中的所有内容。这感觉非常像重复的努力,我想以某种方式避免它。

我希望有人有一个工具或技术来分享,这将允许我直接从服务器渲染击倒ViewModel。可能的解决方案可能包括:

  • 自定义JSON序列化,以便将可观察视图模型直接渲染到数据模型属性中的输出。
  • 自动客户端转换(我听说过ko-autobind,但不知道它是否是推荐的路径或者它是多么稳定/完整)
  • 我还没有想到的东西

我希望解决方案是通用和自动的,因为我目前使用手工输入可观察的客户端视图模型的方法太没有实际价值了。

你是怎么解决这个问题的?

回答

10

根据他们的教程,它只是一个简单的.map功能

如果是这样的视图模型

function Task(data) { 
    this.title = ko.observable(data.title); 
    this.isDone = ko.observable(data.isDone); 
} 

而这个功能GET是从服务器的数据,它使用.map功能注入服务器数据右到VM

// Data 
var self = this; 
self.tasks = ko.observableArray([]); 

// Load initial state from server, convert it to Task instances, then populate self.tasks 
$.getJSON("/tasks", function(allData) { 
    var mappedTasks = $.map(allData, function(item) { 
     return new Task(item) 
    }); 
    self.tasks(mappedTasks); 
}); 

对于KO映射 http://knockoutjs.com/documentation/plugins-mapping.html

对于自动绑定下面是一个例子

https://groups.google.com/forum/#!msg/knockoutjs/IJTx37UXQVw/UTrWdEK1C-oJ

+0

这几乎是什么我已经在做,因为你需要为每一个任务功能查看模型。我正在寻找的解决方案不应该要求我为每个视图模型提供一个方法或类,而只需要一个共享的代码片段来执行转换(无论是客户端还是服务器端)。纠正我,如果我错了。 –

+0

这就是你想要的autobind,我相信它被称为,或者是的,否则你需要有一个为每个:-( –

+0

自动绑定是否工作?它是最近更新7个月前,自述文件说:“这是初始提交并仅支持绑定元素名称viewmodel“,这似乎意味着东西丢失或某些情况下不会工作,没有非常明确的。另外,作者在另一篇文章中链接到的jsfiddle已损坏,如果这是您的建议,可以使用示例;) –

相关问题