在Breezejs中覆盖验证

时间:2014-03-27 19:38:32

标签: c# breeze

这是一个有趣的要求。我如何用Breezejs解决这个问题?

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

我们有一项业务规则,即当我添加或编辑客户电话号码时,我需要查看电话号码以查看是否有不同的客户使用相同的号码(可能因​​电话号码重新分配而发生等)

如果我发现它是双重的,我需要提示用户。用户可以选择说" yah,那很好",然后电话号码无论如何都会保存。

所以,我得到了如何使用BeforeSaveEntity进行基本验证,如果找到dup就失败了,但假设用户检查"保存无论如何"选项。如何在我的存储集中包含此"带外",非数据行信息,以便我可以覆盖服务器端验证规则?

而且,我也不希望这种验证看起来像#"正常"保存时用户出错 - 我想检测到这是电话号码冲突的事情,所以我可以显示提示他们覆盖的视图。

1 个答案:

答案 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;
}

希望这是有道理的。 :)