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

时间:2011-02-23 13:30:56

标签: 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("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调用为实体发送“分配”消息,就像测试一样。这可能适用于插件,但为执行事件发送消息似乎很奇怪,实际上并不只是为了运行一些C#代码(“分配”,“更新”等)而且我不喜欢看到创建自己的消息的方法。

5 个答案:

答案 0 :(得分:10)

您无法在2011年添加自己的网络服务或创建自己的自定义插件消息。我们发现这样做的最佳方式是:

  1. 设置一个专门存在的实体,以便在服务器上运行自定义代码。
  2. 为其提供名为message name的属性和另一个属性,以您选择的任何格式传递参数(XML,JSON等)
  3. 从您的JavaScript中,创建传递正确参数的实体实例。
  4. 将一个插件附加到该实体的Create消息,然后读入参数并执行您想要的任何自定义代码。
  5. 虽然只是随机传递一个Assign消息或某些东西可能有效,但在微软的眼中它可能不受支持,如果其他人不得不看这个系统那么调试就好了。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

答案 3 :(得分:1)

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

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

CrmRestKit

XrmServiceToolkit

玩得开心

丹尼尔

答案 4 :(得分:0)

我在这里参加聚会的时间比较晚,但只是为了简化那些为最新版本的CRM查看此主题的人(因为它被标记为crm online): 目前有一些被称为" Action"可以像工作流程或业务流程流程一样创建。您可以为该Action指定输入和输出参数。主要优点:

  • 您可以为该操作注册一个插件,因此您可以运行一些c#logic

  • 而不是运行jScript逻辑
  • 您可以使用webAPI

  • 调用此操作

至于CRM 2011,虽然它已经过时了 - 比接受行动中建议的更好的方法是在自定义实体的post RetrieveMutliple上运行你的逻辑,这样你就可以避免创建/删除一些魔术记录(并且用户只需要具有读取权限,而不是创建或更新)。