我正在启动MVC,我理解模型和ViewModels之间的区别,感谢这篇文章:
http://rachelappel.com/use-viewmodels-to-manage-data-amp-organize-code-in-asp.net-mvc-applications
但是我向同事展示了这一点,现在我觉得这是使用knockout将视图绑定到模型的替代方法。有人可以解释一下吗?敲除绑定是否与定义具有属性的ViewModel类相同?
谢谢!
答案 0 :(得分:5)
在约定中你可以使用Knockout视图模型作为客户端,MVC视图模型作为服务器端。
您的问题:您如何决定使用哪个?
答案:您可以同时使用两者。这意味着您的单个cshtml
页面可以有一个淘汰视图模型如下所示。它包含属性和功能作为一个单元这个视图模型用于客户端功能所需的行为。
//This is a simple Viewmodel
//JavaScript that defines the data and behavior of your UI
function AppViewModel() {
var self = this;
self.firstName = ko.observable();
self.lastName = ko.observable();
self.fullName = ko.computed(function () {
return self.firstName() + " " + self.lastName();
});
self.capitalizeLastName = function () {
var currentVal = self.lastName();//Read the current value
self.lastName(currentVal.toUpperCase());//Write back a modified value
};
}
但是对于show server端行为,您可以使用更复杂(或更多属性)的MVC视图模型。这是为了从数据库中获取数据并在视图中显示这些数据。
结论:因此,在使用MVC时,您可以同时使用两种视图模型。
重要提示:但是如果您需要在两个方案中使用单一视图模型,那么您也可以执行该操作。为此,您必须使用KnockoutJS Mapping plugin
。
可以像下面一样使用。
<script src="~/Scripts/knockout.mapping-latest.js"></script>
<script type="text/javascript">
$(function() {
var viewModel = ko.mapping.fromJS(@Html.Raw(Model.ToJson()));
ko.applyBindings(viewModel);
});
</script>
您可以从Loading KnockoutJS View Models from ASP.Net MVC, for faster page loads
获取有关此内容的更多详情如果您需要了解更多关于Knockout的信息,请查看learn.knockoutjs
我希望这会对你有所帮助。
答案 1 :(得分:3)
Knockout视图模型是客户端,MVC是服务器端,这是最大的区别。
Knockout允许您创建单页面应用程序,并在客户端封装逻辑。
MVC中的ViewModel仅适用于服务器端,用于呈现页面和处理回发。
答案 2 :(得分:0)
Xharze的回答是有效的,但是......
如果您需要向无法完成客户端的业务实体添加与视图相关的逻辑,则需要具有服务器端View模型。如果不是,他们变得多余。
与经典MVC还有区别,这些服务器端模型不会用于渲染服务器端内容,它们将暴露给使用REST的客户端KO引擎