我正在使用breezejs,我的应用程序的服务器端代码是.net。
在我的观点(客户端),我想添加和实体然后我想保存它。让我们假设一个实体是这样的:
{
"Id": 1,
"Name": "someName",
"CreatedDate": "1900-01-01T05:00:00Z",
"UpdatedDate": "1900-01-01T05:00:00Z",
"CreatedBy": null,
"UpdatedBy": null,
"RowVersion": 0,
etc ...
}
}
我想设置CreatedDate
UpdatedDate
CreatedBy
和UpdatedBy
的值,我当然可以使用javascript来做,但我不希望客户照顾那些事情。
我的微风控制器,生活这个功能是这样的:
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
因为你可以看到saveBundle是一个JObject,当我调试时我看到这样的saveBundle:
{
"entities": [
{
"Id": 1,
"Name": "someName",
"CreatedDate": "1900-01-01T05:00:00Z",
"UpdatedDate": "1900-01-01T05:00:00Z",
"CreatedBy": null,
"UpdatedBy": null,
"RowVersion": 0,
etc ...
}
}
}
],
"saveOptions": {}
}
如何在提交保存之前更改saveBundle中CreatedDate
UpdatedDate
CreatedBy
和UpdatedBy
的值???
这是一个JObject,有一个对象数组作为proprety,我可以用javascript操纵Json,我怎么能用.Net ???
非常感谢。
答案 0 :(得分:5)
感谢Jay Traband的帖子,我终于找到了一种在保存之前对实体进行更改的方法。
我像这样重载了BeforeSaveEntity
:
protected override bool BeforeSaveEntity(EntityInfo entityInfo) {
// Return false if don´t want to save the entity
var entityType = entityInfo.Entity.GetType();
if (entityInfo.Entity.GetType() == typeof(MyEntityTypeModel))
{
if (entityInfo.EntityState == EntityState.Added)
// It can be 'Modified' or 'Deleted'
{
var MyModel = entityInfo.Entity as MyEntityTypeModel;
MyModel.CreatedDate = DateTime.Now;
MyModel.UpdatedDate = DateTime.Now;
string username = Membership.GetUser().UserName;
MyModel.CreatedBy = username;
MyModel.UpdatedBy = username;
}
}
return true;
}
非常感谢,我希望有一天能帮到某人。
答案 1 :(得分:3)
您可以使用 ContextProvider的虚拟 BeforeSaveEntity 和 BeforeSaveEntities 方法拦截Breeze的服务器端保存过程。文档here和here提供了有关此主题的更多信息。
例如,您可以使用以下代码覆盖 BeforeSaveEntities 。
protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) {
foreach (var type in saveMap.Keys) {
var list = saveMap[type];
foreach (var entityInfo in list) {
var entity = entityInfo.Entity;
// .. do something interesting here
}
}