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

В Dynamics 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 моей команде ленты, но, к сожалению, аргумент имеет тип Mscrm.FormControlLite и это не имеет getAttribute функция или любая функция, которая позволила бы получить доступ к formContext (по крайней мере, я не вижу ничего полезного). Несколько скриншотов из инструментов разработчика:

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

2 ответа

Решение

Согласно https://docs.microsoft.com/en-us/dynamics365/get-started/whats-new/customer-engagement/important-changes-coming вы передаете его как Параметр PrimaryControl.

Поэтому, если вы передаете PrimaryControl в качестве второго параметра в командную функцию, подобную этой, вы можете использовать

arguments[1].getAttribute(…)

После передачи 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-ribbon-actions 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).

Проблема с использованием 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;
}

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

var formContext = primaryControl.getFormContext();

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

В настоящее время я использую CRM 8.2 в сети, но сохраняю свой код обновляемым до 9.0, поэтому я передаю primarycontrol в качестве параметра ленты, но не могу получить метод getFormContext(), поскольку он имеет тип Mscrm.FormControlLite и не имеет getAttribute, getFormContext() метод или что-нибудь

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

var context=Xrm.Utility.getGlobalContext();

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

Другие вопросы по тегам