如何在Dynamics 365 9.0的功能区命令中获取formContext

时间:2018-01-11 08:02:58

标签: dynamics-crm dynamics-crm-online dynamics-crm-365-v9

在Dynamics 365 9.0中,关于如何访问表单属性和控件(而不是Xrm.Page命名空间)发生了很大变化,我们应该将executionContext传递给函数并使用formContext getFormContext()功能。这工作正常,我使用这种方法从来没有问题。

但是我还没想出如何正确访问从Ribbon调用的函数中的formContext。文档说这应该非常简单:

https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/customize-dev/pass-dynamics-365-data-page-parameter-ribbon-actions

function myFunction(executionContext) {
    var formContext = executionContext.getFormContext();
    var focusFieldValue = formContext.ui.controls.get(PrimaryControlId).getAttribute().getValue();
}

但它没有说明如何将executionContext传递给Ribbon函数。在普通函数中有一个复选框“将执行上下文作为第一个参数”但是功能区呢?我们可以将这些参数传递给这些函数,但它们只是所选记录的GUID,或所选记录的类型,甚至是对象列表,但如果参数等于{{1},我在文档中找不到}。有人已经解决了这个问题吗?

另外我知道我可以使用Xrm.Page并且它可以工作(现在至少......)但是我想知道如何使用版本9.0中的最新指南来完成它

更新1:

根据Scott的建议和this article我将PrimaryControl传递给我的Ribbon命令,但遗憾的是,该参数的类型为executionContext且它没有Mscrm.FormControlLite函数或任何允许的函数访问formContext(至少我没有看到任何有用的东西)。 Developer工具的一些截图: enter image description here

所以它看起来像某种形式的表单,但可能与formContext无关(我假设如果从记录列表中调用Ribbon,则此项可以是网格类型或类似的东西)

4 个答案:

答案 0 :(得分:11)

根据https://docs.microsoft.com/en-us/dynamics365/get-started/whats-new/customer-engagement/important-changes-coming#some-client-apis-are-deprecated,您将其作为PrimaryControl参数传递。

enter image description here

因此,如果将PrimaryControl作为第二个参数传递给这样的命令函数,则可以使用

arguments[1].getAttribute(…)

答案 1 :(得分:1)

我也有同样的问题。我发现的是,微软doco有一个错误。请遵循Scott提到的任何从功能区命令操作传递CRM参数的内容。 在javascript函数中,请尝试以下获取表单上下文

var formContext = primaryControl.getFormContext();

这解决了我的问题。

答案 2 :(得分:1)

按照@ scott-durow的建议传递primaryControl之后,最好不要使用primaryControl.getFormContext(),而应使用primaryControl,就像它是formContext。

根据文档(1/2/2019):https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/customize-dev/pass-dynamics-365-data-page-parameter-ribbon-actions#form-and-grid-context-in-ribbon-actions,应该在primaryControl上执行操作,就好像它是formContext。

function mySampleFunction(primaryControl) {
    var formContext = primaryControl;
    // Perform operations using the formContext object
}

但是,提供的示例的关键部分是: //使用formContext对象进行操作(不知道为什么他们添加了var formContext = primaryControl行,imo,它会如果他们只是显示一个示例,就会更清楚: primaryControl.getAttribute('xxxx');

我怀疑primaryControl.getFormContext()代码开始被使用,因为那是在使用表单(https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/clientapi-form-context#using-the-formcontext-object-instead-of-the-xrmpage-object)时如何获取formContext的。

使用primaryControl.getFormContext()的问题在于它可以与普通的Web界面一起使用,但无法与UCI一起使用。但是,如果您使用primaryControl就像它是表单上下文一样,则它适用于旧版Web客户端和uci界面。

这是我使用的功能:

function getFormContext(executionContext) {
     var formContext = null;
     if (executionContext !== null) {
         if (typeof executionContext.getAttribute === 'function') {
             formContext = executionContext; //most likely called from the ribbon.
         } else if (typeof executionContext.getFormContext === 'function' 
                 && typeof(executionContext.getFormContext()).getAttribute === 'function') {
            formContext = executionContext.getFormContext(); // most likely called from the form via a handler
         } else {
            throw 'formContext was not found'; //you could do formContext = Xrm.Page; if you like.
        }
    }
    return formContext;
}

答案 3 :(得分:0)

您可以做一些技巧,不必通过RibbonWorkbench实用程序将主控件作为Crm参数传递,否则,它将无法为您工作,因为如果您尝试执行此操作,可能会发生这种情况在家用网格丝带中。

var context=Xrm.Utility.getGlobalContext();

我希望这对您或其他任何人都有用。