使用Notify.js - CRM添加指向新创建的实体记录的链接

时间:2016-10-09 17:56:57

标签: javascript c# dynamics-crm crm

我有一个自定义工作流活动,可以从我的自定义工作流活动中创建新机会。 我把这项活动作为一个行动步骤。我正在使用动作,因为它有一个输出。我需要获得我创造的机会。 我使用Process.js从JS Web资源调用该操作。之后,我使用Notify.js通知用户创建了机会。在那个通知上,我需要有一个链接到新创建的机会的按钮。

以下是与输出参数相关的C#代码的一些部分。只是注意到创建机会的代码部分以及执行更多任务的工作正常:

//define variable
[Output("Opportunity")]
[ReferenceTarget("opportunity")]
public OutArgument<EntityReference> NewOpportunity { get; set; }

//create opportunity and entity reference(i am not sure do ineed entity reference, or something else for that link)
Guid opportunityId = service.Create(opportunity);
EntityReference OppId = new EntityReference(opportunity.LogicalName, opportunityId);

//assign value to the output variable
NewOpportunity.Set(Econtext, OppId);

以下是我在动作定义中创建动作参数的方法: enter image description here

以下是调用action的JS代码:

function toOpportunity(){

Process.callAction("ad_opportunity",
    [{
        key: "Target",
        type: Process.Type.EntityReference,
        value: { id: Xrm.Page.data.entity.getId(), entityType: "ad_productsamplerequest" }
    }],
    function (param) {
        //Success            
         Notify.add("New Opportunity was created:", "INFO", "opportunity",
    [{
        type: "button",
        text: "Go to opportunity",
        callback: function () {

        }
    }]);
    },
    function () {
        // Error
        alert("Opportunity was not created");
    }
);

只是说,它有效,行动被召唤,机会被创造,之后有通知。只是不知道如何使用动作输出参数来设置机会的链接。

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试处理CodeActivity课程中的操作。这不行。 OutArgument属性只能在工作流程中访问,不能返回到调用进程。

而是使用所需的输入和输出参数创建一个动作。然后创建一个插件并在此操作上注册同步后更新步骤。插件类实现必须将机会ID添加到OutputParameters集合,如下所示:

public void Execute(IServiceProvider serviceProvider)
{
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
    var service = factory.CreateOrganizationService(context.UserId);

    Entity opportunity;
    // TODO: add code here to build the opportunity.

    Guid opportunityId = service.Create(opportunity);
    context.OutputParameters.Add("NewOpportunity", new EntityReference("opportunity", opportunityId));
}

另请参阅MSDN上的此解释。

答案 1 :(得分:0)

正如Henk悲伤,无法通过实体参考,所以我在我的CodeActivity中将Guid作为字符串传递:

 [Output("Opportunity")]
 public OutArgument<string> NewOpportunity { get; set; }

...

Guid opportunityId = service.Create(opportunity);
 string guidSend = opportunityId.ToString();
 NewOpportunity.Set(Econtext, guidSend);

之后我在JS中使用了这个输出:

var OGuid = param["NewOpportunity"];
        Opport = OGuid.replace(/ /g,'');

并设置与这样的新机会的关系:

Xrm.Utility.openEntityForm("opportunity",""+Opport);

JavaScript的第一部分在Action调用中,但不在通知中,最后一行在通知中,因此它们位于代码的不同部分。因此我将Opport定义为全局变量,然后我可以在一个函数中设置值,并在通知中从其他函数中调用它。

还有另一个选项,没有C#部分。可以在通知回调函数中创建提取并返回上次创建的商机ID。这更容易,但不是更好:

     var contactFetchXML = "<fetch mapping='logical' version='1.0' distinct='true' count='1' >"+
                              "<entity name='opportunity' >"+
                                "<attribute name='opportunityid' />"+
                                "<order attribute='createdon' descending='true' />"+
                              "</entity>"+
                          "</fetch>";


    var Guid = XrmServiceToolkit.Soap.Fetch(contactFetchXML);

    Xrm.Utility.openEntityForm("opportunity",""+Guid[0].id);