none
plugin中为何获取不到修改后的实体对象 RRS feed

  • 问题

  • 需求:只允许部分用户可以执行“停用”account的功能。mscrm不能对“停用”功能单独设置权限,所以只有通过开发实现。客户端脚本过滤 + 服务器端plugin 两头都处理,确保万无一失。

    问题:在plugin中为何PostImage为空,或者我该如何才能拿到客户端提交过来的修改过后的account实体对象?

    plugin注册设置信息:
    ----------------------------------------
    Message:  Update
    Primary Entity: account
    Filtering Attribute: All Attributes

    Eventing Pipeline Stage of :Pre Stage
    Execution Mode: Synchronous
    Step Deployment: Server
    Triggering: Parent Pipeline

    两个Image
    (Step) Update of account in Parent Pipeline:
     (Image) PostImage(All Atrributes)
     (Image) PreImage(All Atrributes)
    ----------------------------------------

    程序代码:
    ----------------------------------------
    if (context.PreEntityImages.Contains("PreImage"))
    {
        (DynamicEntity)preEntity = (DynamicEntity)context.PreEntityImages.Properties["PreImage"];
        oldStateCode = preEntity.Properties["statecode"].ToString();
        cardno_ext = preEntity.Properties["ht_cardno_ext"].ToString();
    }
    //获取修改后对象
    if (context.PostEntityImages.Contains("PostImage"))//总是获取不到PostImage
    {
        (DynamicEntity)postEntity = (DynamicEntity)context.PostEntityImages.Properties["PostImage"];
        newStateCode = postEntity.Properties["statecode"].ToString();
    }
    ----------------------------------------

    2010年10月14日 2:15

全部回复

  • 你的plugin是注册在pre stage,停用操作还没有执行,那来PostImage,

    IPluginExecutionContext.PostEntityImages Property

    Gets the properties of the primary entity after the core platform operation has been completed.


    刀客 | MSN:caims@techsun.com | BLOG:http://caims.cnblogs.com
    2010年10月14日 3:57
    版主
  • 我该如何才能拿到客户端提交过来的修改过后的account实体对象?

    也就是客户执行了停用操作,提交到服务器的account对象。

    2010年10月14日 7:02
  • 不太明白你要做什么,如果不允许停用,可以通过判断用户,如果是不允许的用户再启用它。或者干脆,停用的时候,取得当前用户判断后抛异常出来。


    Dynamics CRM Consulting
    2010年10月15日 14:20
  • 你提到:“如果不允许停用,可以通过判断用户,如果是不允许的用户再启用它。”

    你指的是,在客户端脚本处理吧!应该是允许停用的用户在启用它,可问题是这种过滤方法不可靠,客户端加载js异常时就会出现问题,造成js功能失效。我在实际应用中却是发生过这种情况。

     

    你又指出“或者干脆,停用的时候,取得当前用户判断后抛异常出来。

             我也是这么做的,可问题是我注册为Pre Stage获取不到客户端提交过来的Account实体。除了从Image中获取外,实际上不知道如何获取。本来试图通过context.InputParameters.Properties中获取,可这好比在hashtable中,不知道key,根本无法寻找到value

     

    我的需求很简单,就是部分用户不能使用Account停用功能,或则我的整个方向都有问题,还请高手指点。翘首期盼!!!

     

     

    2010年10月18日 3:37
  • 为什么要取 account 记录呢?
    刀客 | MSN:caims@techsun.com | BLOG:http://caims.cnblogs.com
    2010年10月18日 3:41
    版主
  • Guid accountGuid = (Guid)context.InputParameters.Properties[ParameterName.EntityId];  //被停用的记录 guid

    然后通过 Retrieve 就可以获取 客户 记录 了  


    刀客 | MSN:caims@techsun.com | BLOG:http://caims.cnblogs.com
    2010年10月18日 3:54
    版主
  • Guid accountGuid = (Guid)context.InputParameters.Properties[ParameterName.EntityId];  //被停用的记录 guid
    依据你给出的提示进行操作,提示the given key was not present in the dictionary。之前也执行过类似的语句,跟这个问题一样,获取不到值。为何呢?很是头疼,是不是plug的注册有问题呢?

    2010年10月18日 8:31
  • 提供你的plugin注册信息


    刀客 | MSN:caims@techsun.com | BLOG:http://caims.cnblogs.com | 提供微软CRM高级开发顾问外包
    2010年12月12日 4:59
    版主
  • Guid accountGuid = (Guid)context.InputParameters.Properties[ParameterName.EntityId]有问题

     

     

    if (context.InputParameters.Properties.Contains("EntityMoniker"))
    {
    if (context.InputParameters.Properties.Contains("State"))
    {
    entity = (Moniker)context.InputParameters.Properties[ParameterName.EntityMoniker];
    opportunityid = entity.Id.ToString();
    }
    }


    jeff.han
    2010年12月12日 11:45