【问题标题】:How to get formContext in Ribbon command of Dynamics 365 9.0如何在 Dynamics 365 9.0 的 Ribbon 命令中获取 formContext
【发布时间】:2020-05-20 08:16:06
【问题描述】:

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

但是我还没有弄清楚如何在从功能区调用的函数中正确访问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 的建议和 this article,我将 PrimaryControl 传递给我的 Ribbon 命令,但不幸的是,参数类型为 Mscrm.FormControlLite,并且它没有 getAttribute 函数或任何允许访问 formContext 的函数(在至少我没有看到任何有用的东西)。开发者工具的一些截图:

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

【问题讨论】:

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


    【解决方案1】:

    根据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(…)
    

    【讨论】:

    • 感谢 Scott 伸出援手!不幸的是,当我通过 PrimaryControl 时,它的类型为 Mscrm.FormControlLite 并且它没有 getAttribute 方法或任何我能看到的可用于替换 Xrm.Page 的东西(我更新了我的问题)。根据您发布的文章,它应该以这种方式工作,所以这很奇怪......
    • 您是从表单或网格按钮调用命令吗?在 Unfiied Client 内部的表单上下文中,我已在版本 1612 (9.0.0.3172) (DB 9.0.0.3172) 中成功使用此技术在线
    • 统一接口是这里的关键词 :) 你说得对,它可以在 UI 中使用,我希望他们能让它在普通的 Web 客户端中也可以使用...
    • 不幸的是,Web 和 UUI 之间仍然存在许多差异 - 可能使用类似 var formContext = primaryControl.ui 之类的东西? primaryControl : Xrm.Page
    • 是的,我最终还是这样做了,感谢您的帮助!
    【解决方案2】:

    按照@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;
    }
    

    【讨论】:

    • 链接到文档,当这是真的(因为 v9 js 似乎经常变化,这可能不会永远是真的)github.com/MicrosoftDocs/dynamics-365-customer-engagement/blob/…
    • 最好不要使用primaryControl.getFormContext(),而是使用primaryControl,就好像它是formContext一样。这句话救了我!这次真是万分感谢!!这很重要!
    【解决方案3】:

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

    var formContext = primaryControl.getFormContext();
    

    这解决了我的问题。

    【讨论】:

    • docs.microsoft.com/en-us/dynamics365/customer-engagement/…function mySampleFunction(primaryControl) 的区域中,MS 文档确实是错误的 :(
    • 具体如何从Xrm.Page.context.getQueryStringParameters().etc;迁移?
    • (在上面回答自己的问题)-> 到此:var formContext = primaryControl.getFormContext(); 后跟 formContext.context.getQueryStringParameters().etc..... 到目前为止,您在 任何地方 都有 Xrm .page,只要把formContext放在它的位置上(在函数param中接收后)
    • 我发现的是“primaryControl.getFormContext();”仅适用于 Web 界面,不适用于 UCI。使用primaryControl,就好像它是表单上下文一样。这将使您的代码在 Web 和 UCI 中都可以工作。 (docs.microsoft.com/en-us/dynamics365/customer-engagement/…)
    • @mmcrae,您的代码与 UCI 中断。最好这样做:primaryControl.context.getQueryStringParameters()(从 v9.1.0.1006 开始为真),它适用于 web 和 UCI
    【解决方案4】:

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

    var context=Xrm.Utility.getGlobalContext();
    

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

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多