在Breezejs中重写验证

本文关键字:验证 重写 Breezejs | 更新日期: 2023-09-27 17:54:42

这里有一个有趣的需求。我该如何用Breezejs解决这个问题?

(注意,使用的SPA设计基于John Papa的Angular + Breezejs Pluralsight课程,并且非常类似)

我们有一个业务规则,当我添加或编辑客户电话号码时,我需要检查电话号码,以查看是否有具有相同号码的不同客户(可能由于电话号码重新分配等原因而发生)。

如果我发现它是dup,我需要提示用户。用户可以选择说"是的,那很好",然后电话号码将保存。

所以,我知道如何做一个基本的验证beforeaveentity,并失败,如果我发现dup,但假设用户检查"保存无论如何"选项。我如何在保存集中包含这个"带外"的非数据行信息,以便我可以覆盖服务器端验证规则?

而且,我不希望这个验证在用户保存时看起来像一个"正常"错误——我想检测到这是电话号码冲突的事情,所以我可以显示提示他们重写的视图

在Breezejs中重写验证

带外数据可以通过使用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;
}

希望这是有意义的。:)