C# 从Ribbon JScript CRM Online 2011调用C代码

C# 从Ribbon JScript CRM Online 2011调用C代码,c#,javascript,dynamics-crm,dynamics-crm-2011,dynamics-crm-online,C#,Javascript,Dynamics Crm,Dynamics Crm 2011,Dynamics Crm Online,我需要在一个实体上单击功能区按钮执行一些代码,该实体更新CRM Online 2011中的一些相关数据。我宁愿不必在JScript中编写所有这些逻辑。有没有办法从JScript调用C代码?我从功能区中查看了Microsoft正在使用的JScript文件,该文件如下所示: Mscrm.Campaign.copyCampaign = function (campaignId, saveAsTemplate) { var $v_0 = new RemoteCommand("MarketingA

我需要在一个实体上单击功能区按钮执行一些代码,该实体更新CRM Online 2011中的一些相关数据。我宁愿不必在JScript中编写所有这些逻辑。有没有办法从JScript调用C代码?我从功能区中查看了Microsoft正在使用的JScript文件,该文件如下所示:

Mscrm.Campaign.copyCampaign = function (campaignId, saveAsTemplate) {
    var $v_0 = new RemoteCommand("MarketingAutomation", "CopyCampaign", null);
    $v_0.SetParameter("campaignId", campaignId);
    $v_0.SetParameter("saveAsTemplate", saveAsTemplate.toString());
    var $v_1 = $v_0.Execute(),
        $v_2 = $v_1.ReturnValue;
    openObj(Mscrm.EntityTypeCode.Campaign, $v_2, null, null, Mscrm.NavigationMode.NavigationModeInline, null);
    Mscrm.Utilities.refreshParentGrid(Mscrm.EntityTypeCode.Campaign, campaignId)
};
我看到一个RemoteCommand调用被放置,我假设它将返回到某个web服务函数。我希望做这样的事情。我可以添加自己的web服务功能吗


我能够从JScript调用,为实体发送一条“Assign”消息,就像测试一样。这可能适用于中的插件,但发送一条执行事件消息似乎有些奇怪,该事件实际上并不是为了运行一些C#代码(“分配”、“更新”等),我看不到创建自己消息的方法。

2011年,您无法添加自己的web服务或创建自己的自定义插件消息。我们发现最好的方法是:

  • 设置独占存在的实体以在服务器上运行自定义代码
  • 为它指定名为messagename的属性和另一个属性,以便以您选择的任何格式(XML、JSON等)传入参数
  • 从JavaScript中,创建该实体的一个实例,并传递正确的参数
  • 在该实体的创建消息中附加一个插件,然后它读入参数并执行您想要的任何自定义代码

  • 虽然只是随机地传递一条分配消息或某些东西可能会起作用,但在Microsoft看来,这可能是不受支持的,而且如果其他人不得不查看此系统,调试将非常困难。

    还有另一种方法,在表单中插入两个选项,单击在功能区中创建的自定义按钮时,将两个选项的值设置为true,然后运行窗体的保存方法,在为实体创建的插件中,检查两个选项的值是否为true,然后运行代码,然后再次将两个选项的值设置为false。同样,在表单中,您可以使这两个选项不可见。

    我想这就是您要寻找的。

    好吧,编写大量JavaScript逻辑是一个混乱的想法,但是创建通过创建操作(或多或少是命令模式)触发“真实”逻辑的js代码也会导致一个复杂的解决方案

    根据复杂程度和需求(例如,在js中不可能对另一个用户的行为执行操作),我总是更喜欢纯js方法。要降低复杂性,请尝试在功能上为您提供核心的库:

    玩得开心


    Daniel

    我在这里参加聚会迟到了,但我只是想为那些关注最新版本CRM主题的人们简化一些事情(因为它被标记为CRM online): 目前有一种称为“动作”的东西,可以用与工作流或业务流程流相同的方式创建。可以为该操作指定输入和输出参数。主要优点:

    • 您可以为该操作注册一个插件,因此您可以运行一些c#逻辑,而不是运行jScript逻辑

    • 您可以使用webAPI调用此操作


    至于CRM 2011,尽管它已经过时了-比公认的操作中建议的更好的方法是在自定义实体的post RetrieveMutliple上运行您的逻辑,这样您就可以避免创建/删除一些神奇记录(用户只需要拥有读取权限,而不需要创建或更新).

    听起来微软似乎没有考虑清楚这一点。我将尝试一下您的解决方法,因为这似乎是除了用JavaScript编写所有内容之外唯一可用的方法。谢谢你的帮助!嗨,有什么例子可以说明这一点吗?我是CRM新手,我想在用户点击功能区中的按钮时运行一些c代码。我希望还有人读到这个。我已经成功地使用了这个方法。在我的senario中,代理实体(实体P)创建插件创建了另一个实体(实体A)的实例,该实体随后启动了实体A的创建插件。我不希望在这个特殊的senario中发生这种情况,在这里,由于在功能区中单击按钮而创建了实体A。我必须确保实体A的创建插件恰当地处理了这两个senarios。这没什么大不了的,但要记住一点。+1,与大多数(如果不是全部)情况一样,功能区按钮操作会触发实体的更新事件。因此建议这样做。请从共享链接中添加一些引用,用自己的话解释,而不是简单地粘贴一个链接作为答案。