在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?
答案 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 %>
快乐的编码!