在Breezejs中重写验证
本文关键字:验证 重写 Breezejs | 更新日期: 2023-09-27 17:54:42
这里有一个有趣的需求。我该如何用Breezejs解决这个问题?
(注意,使用的SPA设计基于John Papa的Angular + Breezejs Pluralsight课程,并且非常类似)
我们有一个业务规则,当我添加或编辑客户电话号码时,我需要检查电话号码,以查看是否有具有相同号码的不同客户(可能由于电话号码重新分配等原因而发生)。
如果我发现它是dup,我需要提示用户。用户可以选择说"是的,那很好",然后电话号码将保存。
所以,我知道如何做一个基本的验证beforeaveentity,并失败,如果我发现dup,但假设用户检查"保存无论如何"选项。我如何在保存集中包含这个"带外"的非数据行信息,以便我可以覆盖服务器端验证规则?
而且,我不希望这个验证在用户保存时看起来像一个"正常"错误——我想检测到这是电话号码冲突的事情,所以我可以显示提示他们重写的视图
带外数据可以通过使用SaveOptions传递。标记属性或转到保存调用中的单独命名端点。例如
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;
}
希望这是有意义的。:)