似乎所有现有的breathjs示例都在将实体模型传入和传出BreezeController
.
但几乎我们所有构建的页面都使用某种形式的视图模型。在我们没有 BreezeJs 的日子里,我们从存储库中检索数据(域模型)以填充(使用 AutoMapper 或手动)视图模型,该模型仅包含该视图所需的数据。WebAPI 仅将视图模型数据发送到浏览器,我们可以在其中填充客户端视图模型(通常是knockout
observable)。
保存数据时,我们从 a 收集数据<form>
以填充输入视图模型,仅将这些数据发送到服务器,其中输入视图模型中的数据被映射到域模型。通过调用存储库SaveChanges()
中的DbContext
实体来保存更新。
现在,BreezeJs
是通过创建一个EFContextProvider
. 我见过的例子通常是检索领域模型数据,然后将其全部传递给客户端。
[HttpGet]
public IQueryable<Item> Items() {
return _contextProvider.Context.Items;
}
构建视图模型是客户端 javascript 的工作。
当然我们可以在服务器端构建视图模型:
[HttpGet]
public List<ItemViewModel> Items() {
var items = _contextProvider.Context.Items
.Include("RelatedEntity")
.ToList();
var model = new List<ItemViewModel>();
.... some code to build model from items ....
return model;
}
好处是通过网络传输的数据更少,我们可以在服务器端进行许多操作。但我不知道这样修改是否是一个好习惯BreezeController
。但至少,它返回列出所有项目所需的数据。
当我尝试 POST 数据时,真正的麻烦来了。
在我发现的 BreezeJs 示例中,他们使用 ako.observableArray()
来存储所有域模型数据,比如说vm.items
. 然后将新记录newItem
构建manager.createEntity
到域模型中。在验证数据之后item.entityAspect.validateEntity()
,newItem
被推入vm.items
并被manager.saveChanges()
调用,它以某种方式SaveChanges()
在 BreezeController 上调用。
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle) {
return _contextProvider.SaveChanges(saveBundle);
}
我发现被接管的东西太多了!(如果您不同意,请嘲笑我。)我的问题是:
我可以
createEntity
然后saveChanges
吗?我只有一个空表格要填写和提交。当然没有必要items
在客户端构建一个完整的阵列。我可以将输入视图模型作为 a 传递
JObject
并在调用之前进行一些服务器端处理_contextProvider.SaveChanges()
吗?
原来又是一篇超长的帖子。感谢您通读。真的很感激!