从MVC3服务器端传递用于backbone.js的ViewModel

时间:2011-11-17 17:30:00

标签: javascript asp.net-mvc design-patterns mvvm backbone.js

在ASP.NET MVC中有模型,视图和控制器。

MODEL表示存储在数据库中的实体,基本上是应用程序中使用的所有数据(例如,由EntityFramework生成,“DB First”方法)。

并非所有要在视图中显示的模型数据(例如,密码的哈希值)。因此,您可以为应用程序中的每个强类型剃刀视图创建VIEW MODEL。 像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyProject.ViewModels.SomeController.SomeAction
{
    public class ViewModel
    {
        public ViewModel()
        {
            Entities1 = new List<ViewEntity1>();
            Entities2 = new List<ViewEntity2>();
        }

        public List<ViewEntity1> Entities1 { get; set; }
        public List<ViewEntity2> Entities2 { get; set; }

    }

    public class ViewEntity1
    {
        //some properties from original DB-entity you want to show
    }
    public class ViewEntity2
    {

    }
}

当你创建复杂的客户端接口(我这样做)时,你在客户端,MVC或MVVM上使用一些javascript模式(我只知道这些)。因此,对于客户端上的MVC,您有另一个模型(例如Backbone.Model),这是应用程序中的第三个模型。这有点多了。

为什么我们不在客户端(在backbone.js或其他框架中)使用相同的ViewModel模型?有没有办法将CS编码模型转换为JS编码?就像在MVVM模式中一样,使用 knockout.js ,当你可以这样做时:

在SomeAction.cshtml中

<div style="display: none;" id="view_model">@Json.Encode(Model)</div>

之后在Javascript代码中

var ViewModel = ko.mapping.fromJSON($("#view_model").get(0).innerHTML);

现在您可以使用一些操作,事件处理程序等扩展ViewModel:

ko.utils.extend(ViewModel, {

some_function: function () {
//some code
}

});

因此,我们不再在客户端上构建相同的视图模型,我们正在从服务器传输现有的视图模型。至少,数据。

但是knockout.js不适合我,你不能用它构建复杂的UI,它只是数据绑定。我需要更具结构性的东西,比如backbone.js。

为backbone.js构建ViewModel的唯一方法我现在可以看到用手从服务器重写JS中的相同ViewModel。

有没有办法从服务器传输它?在服务器视图和客户端视图上重用相同的viewmodel?

1 个答案:

答案 0 :(得分:4)

如果您的ViewModel可以一对一映射到Backbone.js Model,那么您只需将ViewModel序列化为JSON,然后将其作为结果返回给Backbone。 js模型请求。因此,在javascript模型中,您指定了ASP.NET MVC操作的URL

Person = Backbone.Model.extend({

  url: function() {
    return this.isNew() ? '/Users/Create' : '/Users/' + this.get('id');
  }

});

在ASP.NET MVC中,您可以编写如下内容:

var data = somedata;
var viewModel = new ViewModel();
var serializer = new JavaScriptSerializer();
viewModel.JsonData = serializer.Serialize(data);

return View("viewname", viewModel);

然后使用

<%= Model.JsonData %>

快乐的编码!