1

几天前我开始了 MS CRM 开发,今天我花了几个小时在这个非常简单的基本操作上,并没有找到我做错了什么的运气。

我想在创建记录时更新联系人实体的中间名。我可以用下面的代码来做。

但是现在我想在打开联系人记录时做同样的事情。我确实在联系实体下注册了一个关于检索消息的新步骤。但它不起作用..没有抛出异常。

    public class IzzyPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);


            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity currentEntity = (Entity)context.InputParameters["Target"];


                if (currentEntity.Attributes.Contains("middlename"))
                {
                    currentEntity.Attributes["middlename"] = "Middle name changed";
                }
                else
                {
                    currentEntity.Attributes.Add("middlename", "Middle name changed");
                }

                service.Update(currentEntity);


            }
        }
        catch (Exception f)
        {
            throw new InvalidPluginExecutionException(f.ToString());
        }

    }

}
4

3 回答 3

2

打开记录时,您不能在页面加载时使用 javascript 设置中间名值吗?IMO会容易得多

像这样的 onload 会起作用

Xrm.Page.getAttribute('middlename').setValue('New Middle Name');

如果您需要从同一实体中的其他字段计算中间名,您可能需要参考MSDN 上的 XRM Page 文档

于 2012-04-27T11:11:17.713 回答
0

我建议使用 JavaScript 来执行此操作。我不认为你可以注册一个可以在打开记录时触发的插件。

于 2012-04-27T06:41:10.540 回答
0

我不会质疑您为什么要这样做,或者您将在哪里获得中间名的值,但是我怀疑问题在于您的插件/更新的排序。Retrieve由于消息如此频繁地被调用,因此针对消息编写插件并不是一个好主意。我个人认为 JScript 是要走的路,但是......

如果您想在 Retrieve 中插入一个值middlename并将其返回给用户,但将其提交给数据库(我知道这不是您的确切问题),那么:

  1. 在 Retrieve 消息的Post-operation中注册您的插件
  2. 在您的代码中输入:
>     Entity currentEntity = (Entity)context.OutputParameters["Entity"];
>     if(currentEntity.Attributes.contains("middlename"){
>         currentEntity["middlename"] = "New value";    
>     }else{
>         currentEntity.Attributes.Add("middlename","New value");
>     }

如果您想在 Retrieve 上插入一个值middlename并将其返回给用户并将其提交给数据库,那么我怀疑您需要将两者结合到一个在 Retrieve 操作前后注册的插件中,然后执行类似的操作这个(但我什至对每次检索都尝试更新......!):

public class IzzyPlugin : IPlugin
{
    public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                var middleNameValue = "Middle name changed";
                Entity currentEntity;

                // Pre-stage plugin
                if(context.Stage < 30){
                    currentEntity = (Entity)context.InputParameters["Target"];

                    if (currentEntity.Attributes.Contains("middlename"))
                    {
                        currentEntity.Attributes["middlename"] = middleNameValue;
                    }
                    else
                    {
                        currentEntity.Attributes.Add("middlename", middleNameValue);
                    }
                    service.Update(currentEntity);
                }else{
                    currentEntity = (Entity)context.OutputParameters["Entity"];
                    if(currentEntity.Attributes.contains("middlename"){
                        currentEntity["middlename"] = middleNameValue;    
                    }else{
                        currentEntity.Attributes.Add("middlename",middleNameValue);
                    }                   
                }
            }
        }
        catch (Exception f)
        {
            throw new InvalidPluginExecutionException(f.ToString());
        }
    }
}
于 2012-05-17T11:16:55.993 回答