3

我开始 MVC 并且我了解模型和 ViewModels 之间的区别,这要感谢这篇文章:

http://rachelappel.com/use-viewmodels-to-manage-data-amp-organize-code-in-asp.net-mvc-applications

然而,我向我的同事展示了这个,现在我的印象是,这是使用敲除将视图绑定到模型的替代方法。有人可以解释一下吗?淘汰绑定是否与定义具有属性的 ViewModel 类做同样的事情?

谢谢!

4

3 回答 3

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
        };
    }

但是对于显示服务器端行为,您可以使用 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> 

您可以从从 ASP.Net MVC 加载 KnockoutJS 视图模型中获得更多详细信息,以加快页面加载速度

如果您需要了解更多关于 Knockout 的信息,请查看learn.knockoutjs

我希望这对你有帮助。

于 2013-01-17T19:52:09.137 回答
3

淘汰视图模型是客户端,MVC 是服务器端,这是最大的区别。

Knockout 允许您创建单页应用程序,并在客户端封装逻辑。

MVC 中的 ViewModels 仅在服务器端用于渲染页面和处理回发。

于 2013-01-17T18:39:01.860 回答
0

Xharze 的答案是有效的,但是......

如果您需要将视图相关逻辑添加到无法在客户端完成的业务实体中,那么您需要拥有服务器端视图模型。如果不是,它们就会变得多余。

和经典 MVC 还是有区别的,这些服务端模型不会用来渲染服务端内容,它们会暴露给使用 REST 的客户端 KO 引擎

于 2013-01-17T19:33:27.457 回答