CRM 2013 - 根据条件阻止删除记录

时间:2014-10-09 11:20:57

标签: dynamics-crm-2013

我有一个名为Document Access的实体。现在,此实体文档访问与事件具有N:1关系(一个事件可以具有许多文档访问权限)。

当有人创建新的文档访问记录时,我有一个JS来检查创建记录的人(当前登录用户)是否与事件的所有者相同。如果没有,我禁止创建(这是在保存记录上设置的)。

文档访问记录的所有者可以是任何人(不一定是事件的所有者)。除非由事件所有者完成,否则如何确保防止删除这些文档访问记录?

  1. 我可以通过安全角色实现吗?我无法想出一个可以通过安全角色实现此目的的解决方案,以便在显示视图或表单时甚至不显示删除按钮。
  2. 我可以通过JavaScript连接到删除按钮作为其中一部分来实现相同的目标 丝带?如果是这样,我如何获取正在选择删除的事件ID?如果我们进行批量删除,是否也会触发?
  3. 如果是插件,是否应该在删除操作的预验证阶段?

2 个答案:

答案 0 :(得分:5)

我会尝试回答并确定您自己的每个选项:

  1. 使用安全角色。不,因为您希望根据相关实体的所有权来控制删除。
  2. 使用JavaScript 。您可以使用自定义JavaScript功能区规则隐藏按钮,该规则将事件所有者与文档访问记录所有者进行比较。但是,此方法不支持包括批量删除在内的所有用例。
  3. 使用插件。这是正确的方法,注册预验证就可以了。无论删除请求的来源如何,它都会强制执行您的业务规则。这可以来自用户通过UI,批量删除或平台操作,例如外部集成请求。确保在解释业务规则的异常中返回有意义的消息。

答案 1 :(得分:1)

最好的approcah是通过删除文档访问记录的插件来完成的。

在您的代码中,您可以按照以下步骤操作:

  1. 检索与文档访问相关的事件的所有者:

    Guid incidentId --> You get this form the lookup field, you have in Document Access to Incident Entity incident = service.Retrive("incident", incidentId, new ColumnSet("onwerid"));

  2. 检查触发插件的用户是否是事件的所有者

    // context --> execution plugin context Guid ownerIncident = ((EntityReference)incident.Attributes["ownerid"]).Id; if(ownerIncident != context.InitiatingUserId) { throw new InvalidPluginExecutionContext("Can't delete Documet Access record"); } // otherwise let the record to be deleted