14

在 Dynamics 365 9.0 中,关于如何访问表单属性和控件的方式发生了相当大的变化 -Xrm.Page我们应该传递executionContext给函数并获取formContextusinggetFormContext()函数,而不是命名空间。这工作正常,使用这种方法我从来没有遇到过问题。

但是我还没有弄清楚如何正确访问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 函数。在普通函数中,有一个复选框“将执行上下文作为第一个参数传递”,但是 Ribbon 函数呢?我们可以将一些参数传递给这些函数,但它们只是所选记录的 GUID,或所选记录的类型,甚至是对象列表,但我在文档中找不到,如果有参数等于executionContext. 有人已经解决了这个问题吗?

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

更新1:

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

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

4

4 回答 4

14

根据https://docs.microsoft.com/en-us/dynamics365/get-started/whats-new/customer-engagement/important-changes-coming#some-client-apis-are-deprecated你把它作为初级控制参数。

在此处输入图像描述

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

arguments[1].getAttribute(…)
于 2018-01-11T10:43:11.473 回答
6

在按照@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() 代码开始被使用,因为这就是您在使用表单时获取 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;
}
于 2019-01-02T19:53:16.520 回答
1

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

var formContext = primaryControl.getFormContext();

这解决了我的问题。

于 2018-04-17T05:57:49.390 回答
0

有一个小技巧可以让您不必使用 RibbonWorkbench 实用程序将主控件作为 Crm 参数传递,或者如果这样做了,它将对您不起作用,因为如果您在家中尝试此操作可能会发生这种情况-网格丝带。

var context=Xrm.Utility.getGlobalContext();

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

于 2019-02-14T09:05:13.630 回答