这是一个有趣的要求。我如何用Breezejs解决这个问题?
(注意,使用基于John Papa的Angular + Breezejs Pluralsight课程的SPA设计非常相似)
我们有一项业务规则,即当我添加或编辑客户电话号码时,我需要查看电话号码以查看是否有不同的客户使用相同的号码(可能因电话号码重新分配而发生等)
如果我发现它是双重的,我需要提示用户。用户可以选择说" yah,那很好",然后电话号码无论如何都会保存。
所以,我得到了如何使用BeforeSaveEntity进行基本验证,如果找到dup就失败了,但假设用户检查"保存无论如何"选项。如何在我的存储集中包含此"带外",非数据行信息,以便我可以覆盖服务器端验证规则?
而且,我也不希望这种验证看起来像#"正常"保存时用户出错 - 我想检测到这是电话号码冲突的事情,所以我可以显示提示他们覆盖的视图。
答案 0 :(得分:2)
带外数据可以通过使用SaveOptions.tag属性或在保存调用中转到单独的命名端点来传递。即。
var so = new SaveOptions({ tag: "Special kind of save with extra data" });
return myEntityManager.saveChanges(null, so);
或
var so = new SaveOptions({ resourceName: "SaveWithSpecialValidation", tag: "any special data" });
return em.saveChanges(null, so);
关于如何返回特殊服务器端保存验证
[HttpPost]
public SaveResult SaveWithSpecialValidation(JObject saveBundle) {
// custom tag passed from the client
var theTag = ContextProvider.SaveOptions.Tag;
ContextProvider.BeforeSaveEntitiesDelegate = BeforeSaveWithException;
return ContextProvider.SaveChanges(saveBundle);
}
private Dictionary<Type, List<EntityInfo>> BeforeSaveWithException(Dictionary<Type, List<EntityInfo>> saveMap) {
List<EntityInfo> orderInfos;
if (saveMap.TryGetValue(typeof(Order), out orderInfos)) {
if (YourErrorCheckHere(orderInfos)) {
var errors = orderInfos.Select(oi => {
return new EFEntityError(oi, "WrongMethod", "My custom exception message", "OrderID");
});
// This is a special exception that will be forwarded correctly back to the client.
var ex = new EntityErrorsException("test of custom exception message", errors);
// if you want to see a different error status code use this.
// ex.StatusCode = HttpStatusCode.Conflict; // Conflict = 409 ; default is Forbidden (403).
throw ex;
}
}
return saveMap;
}
希望这是有道理的。 :)