防止引用详细信息编辑,但允许修改引用本身

时间:2013-09-06 08:40:17

标签: c# dynamics-crm-2011 dynamics-crm

不应允许除特定用户之外的所有用户编辑或更新不满足特定条件的报价详细信息,但如果他们愿意,他们必须能够修改报价。

问题是,修改报价(即用户点击活动表格记录中的“修改”按钮)会触发报价详细信息的更新,我无法弄清楚如何识别正在发生的事情。

我目前的尝试是基于一个插件,代码如下所示:

public class PreQuoteProductUpdate : Plugin
{
// I work with CRM Developer Tools to build plugins 
// This goes in Update Message, Pre-Operation, Server Only, pre-image called "preImage"

protected void ExecutePreQuoteProductUpdate(LocalPluginContext localContext)
{
    if (localContext == null)
    {
        throw new ArgumentNullException("localContext");
    }

    IPluginExecutionContext context = localContext.PluginExecutionContext;
    IOrganizationService srv = localContext.OrganizationService;

    Entity preImageEntity = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;

    try
    {
        PluginBody(context, srv, preImageEntity);
    }
    catch (Exception ex)
    {
        throw new InvalidPluginExecutionException("Quote Details Pre-Update", ex);
    }
}

protected void PluginBody(IPluginExecutionContext context, IOrganizationService srv, Entity preImage)
{
    if(IsRevising()) return;

    CheckSomeCondition(context, srv);

    if (preImage.Attributes.ContainsKey("ica_daconfigurazione") && preImage.GetAttributeValue<bool>("ica_daconfigurazione"))
    {
        CheckUser(context, srv);
    }
}

protected void IsRevising()
{
    // I have no clue about the logic to put here: see below.
}

protected void CheckSomeCondition(IPluginExecutionContext context, IOrganizationService srv)
{
    var entity = (Entity)context.InputParameters["Target"];
    // if some fields of entity contain some specific data, throw
    // this always happens
}

protected void CheckUser(IPluginExecutionContext context, IOrganizationService srv)
{
    //allowedUser is read from a configuration entity
    var allowedUser = new Guid();
    if (context.InitiatingUserId.Equals(serviceUser.Id) == false)
        throw new InvalidPluginExecutionException("Can't edit quote details");
}

}

我知道(在Quote插件中)我可以通过检查ParentContext知道正在进行修订,在QuoteDetail插件中是否有类似内容?我试了一下,但我得到的只是被NullReferenceException扔给我。

我应该可以查看State / Status吗?

如果有任何我可能忽略的信息,请问。

1 个答案:

答案 0 :(得分:1)

Pre Create的{​​{1}}消息(第20阶段)上注册,并过滤不属于QuoteDetail的父上下文。如果是,只需返回(实际上什么都不做)。 这同样适用于Quote的{​​{1}}消息 这两条消息都在Update的{​​{1}}消息的上下文中运行。

QuoteDetail