如何在Dynamics 365 9.0的Ribbon命令中获取formContext

Paw*_*cki 13 dynamics-crm dynamics-crm-online dynamics-crm-365-v9

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

更新1:

根据Scott的建议和本文,我将PrimaryControl传递给我的Ribbon命令但不幸的是,参数是类型的Mscrm.FormControlLite,它没有getAttribute函数或任何允许访问formContext的函数(至少我没有看到任何有用的东西).Developer工具的一些截图: 在此输入图像描述

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

Sco*_*row 13

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

在此输入图像描述

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

arguments[1].getAttribute(…)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,Web 和 UUI 之间仍然存在许多差异 - 也许使用类似 var formContext = primaryControl.ui 之类的东西?主控件:Xrm.Page (2认同)

Raj*_*Rao 5

按照@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
}
Run Code Online (Sandbox Code Playgroud)

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

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

使用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;
}
Run Code Online (Sandbox Code Playgroud)