Как получить команду formContext в ленте Dynamics 365 9.0

В динамике 365 9.0 было довольно большое изменение о том, как получить доступ формы атрибутов и элементы управления - вместо Xrm.Page имен, мы должны передать executionContext функции и получить formContext с помощью getFormContext() функции. Это работает отлично, и я никогда не сталкивался с проблемой использования этого подхода.

Однако я еще не понял, как правильно обращаться к 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 к функции ленты. В обычных функциях есть флажок "Пропустить контекст выполнения в качестве первого параметра", но как насчет функций ленты? Есть параметры, которые мы можем передать этим функциям, но они просто GUID выбранных записей или тип выбранной записи или даже список объектов, но я не смог найти в документации, если есть параметр, равный executionContext. Кто-нибудь уже решил эту проблему?

Также я знаю, что могу использовать Xrm.Page, и он будет работать (на данный момент по крайней мере...), но я хотел бы знать, как это можно сделать, используя последние рекомендации в версии 9.0

Обновление 1:

Согласно предложению Скотта и этой статье я передал PrimaryControl моей команде Ribbon, но, к сожалению, аргумент имеет тип Mscrm.FormControlLite и у него нет функции getAttribute или любой функции, которая позволила бы получить доступ к formContext (по крайней мере, я не вижу ничего полезного). Некоторые скриншоты из инструментов разработчика: enter image description here

Таким образом, это похоже на какое-то представление формы, но, вероятно, не связано с formContext (я предполагаю, что если из списка записей будет вызываться лента, этот элемент может иметь тип сетки или что-то в этом роде)

Ответ 1

Согласно 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(…)

Ответ 2

У меня была такая же проблема. Я обнаружил, что в Microsoft doco произошла ошибка. Пожалуйста, следуйте указаниям, которые Скотт упоминал о передаче CRM-параметра из действия команды ленты. В функции javascript, пожалуйста, попробуйте ниже, чтобы получить контекст формы

var formContext = primaryControl.getFormContext();

это исправило мою проблему.

Ответ 3

После передачи primaryControl, как предложено @scott-durow, лучше не использовать 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- ленточные действия # form-and-grid-context-in- tape -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-Вместо-the-xrmpage-объекта).

Проблема с использованием primaryControl.getFormContext() заключается в том, что он работает с обычным веб-интерфейсом, но не работает с UCI. Но если вы используете primaryControl, как если бы это был контекст формы, тогда он работает как с устаревшими интерфейсами веб-клиента, так и с интерфейсом 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;
}

Ответ 4

primaryControl from Entity view имеет значение null.

Как я могу получить доступ к представлению primaryControl или formContext из представления Entity?

Вид сущности

Ответ 5

Есть небольшая хитрость, которую вы можете сделать, чтобы не передавать первичный элемент управления в качестве параметра Crm с помощью утилиты RibbonWorkbench, или, если бы вы сделали это, он не сработал бы для вас, поскольку это могло бы произойти, если вы пытались сделать это дома. лента

var context=Xrm.Utility.getGlobalContext();

Я надеюсь, что это работает для вас или кого-либо еще.