1

数日前に MS CRM の開発を開始しましたが、今日はこの非常に単純な基本操作に何時間も費やしましたが、間違っていることを見つけることができませんでした。

レコードの作成時に、連絡先エンティティのミドル ネームを更新したいと考えています。そして、私は次のコードで行うことができます。

しかし、連絡先レコードを開くときに同じことをしたいと思っています。contact Entity の下の Retrieve Message に新しいステップを登録しました。しかし、それは機能していません..例外はスローされません。

    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になります

このオンロードのようなものが機能します

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

同じエンティティ内の他のフィールドからミドルネームを計算する必要がある場合は、MSDNのXRMページのドキュメントを参照してください。

于 2012-04-27T11:11:17.713 に答える
0

なぜこれをしたいのか、またはミドルネームの値をどこで取得するのかについて質問するつもりはありませんが、問題はプラグイン/更新の順序付けにあると思われます. Retrieveメッセージに対してプラグインを作成することは、非常に頻繁に呼び出されるため、あまり良い考えではありません。個人的にはJScriptがいいと思いますが...

値を挿入し、middlenameこれを取得時にユーザーに返すだけで、これをデータベースにコミットしない場合(私はこれがあなたの正確な質問ではないことを知っています)、次のようにします。

  1. Retrieve メッセージの後処理でプラグインを登録します。
  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 に答える
0

JavaScript を使用してこれを行うことをお勧めします。レコードを開くときにトリガーできるプラグインを登録できないと思います。

于 2012-04-27T06:41:10.540 に答える