【问题标题】:Restricting the creation of new entities in Breeze.js限制在 Breeze.js 中创建新实体
【发布时间】:2013-01-23 08:32:49
【问题描述】:

假设我想使用 Breeze 创建一个 Task 实体(我使用的是 EF),但是因为这是一个真实任务应用程序,所以该任务必须与当前登录的用户相关联.任务具有在保存期间需要填充的 UserId 外键,这就是我被卡住的地方。在大多数客户端应用程序中执行此操作对我来说是一个陌生的概念。我不能很好地在客户端指定 UserId 外键,因为我不希望聪明的用户可能会为另一个用户创建任务。我应该在哪里挂钩到保存过程以使用当前登录的用户(在本例中为 System.Web.HttpContext.Current.User.Identity.Name)填充 UserId FK。

请随时向我指出另一个帖子或文档的方向。正如我所说,这对我来说是一个新概念,所以我真的不知道要搜索什么。

对于回答这个问题的人,我全心全意地爱你。 :)

【问题讨论】:

  • 您的网站使用哪种身份验证?答案可能取决于这些信息。
  • 表单验证。在另一个非 Breeze MVC 4 项目中,我可以轻松地在 WebAPI 控制器操作中访问 System.Web.HttpContext.Current.User 以执行编程安全检查,所以我希望我可以使用 Breeze 控制器做类似的事情。在查询中过滤数据很容易。处理需要在服务器上填充某些属性的新记录的创建是我卡住的地方(我也不知道如何在纯 WebAPI 控制器中执行此操作)。

标签: breeze


【解决方案1】:

查看 Breeze 网站上有关 Custom EFContextProvider's Save Interceptor 的文档。您将需要创建自己的提供程序并实现 BeforeSaveEntity 方法。在该方法中,您可以像使用 MVC4 一样将任务的 UserId 设置为当前用户。

public class TasksContextProvider: EFContextProvider<YourExistingDbContext>  
{

  public override bool BeforeSaveEntity(EntityInfo entityInfo) 
  {
    if (entityInfo.Entity.GetType() == typeof(YourTask)
        && entityInfo.EntityState == EntityState.Added) 
    {
      // add your logic here to set the user and/or do validation
    }
  }

}

【讨论】:

  • 在相关的说明中,我希望我不必通读大量的 Breeze 文档来有效地使用该工具,但看起来我会在射击自己如果我没有的话,脚。问题是,我认为 Breeze 的目的是让事情变得……轻而易举。现在微风开始看起来有些复杂。我想我需要看看微风提供的功能是否值得我为了正确使用它而必须投入的努力。我记得过去的美好时光,我所要做的就是在我的页面代码后面添加一个公共静态 WebMethod。
  • 新的 MVC 4 SPA 模板演示了 ASP 表单身份验证以及将用户信息传递给控制器​​的方法。该模板即将发布的 Breeze 版本展示了如何完全按照 Bryant 的建议应用 BeforeSaveEntity 中的用户信息(感谢 Bryant!)
  • 我对复杂性问题表示同情。我们分享您对文档的反应:文档越多,我们就越担心。 我不会购买带有大量手册的烤面包机。不幸的是,我们都在构建软件。虽然使用 Breeze 有一条简单的“无需思考”的 primrose 路径,但在您开始添加特定于应用程序的关注点(按用户过滤您自己的数据)的那一刻,您正在偏离该路径并走向树林。该文档是您的森林生存指南。我们希望我们知道更好的方法。我们欢迎提出建议。
猜你喜欢
  • 2013-07-27
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多