В crm 2013 AttributeInfo.GetValue возвращает неправильное значение.

У нас возникла странная проблема, которую можно воспроизвести, выполнив следующие действия:

  1. Открыть новую задачу (или любую другую сущность)
  2. Введите текст «Test Subject» в поле «Subject» (или используйте любое другое поле).
  3. Используйте этот Xrm.Page.getAttribute("subject").getValue(); оператор, чтобы получить значение поля субъекта, он вернет «Test Subject».
  4. Теперь очистите поле темы.
  5. Используйте этот Xrm.Page.getAttribute("subject").getValue(); оператор, чтобы получить значение поля субъекта, он вернет «Тестовый субъект», что является неправильным значением, поле субъекта пусто.

Xrm.Page.getAttribute("subject").getValue() возвращает неправильное значение. Мы проверили эту проблему в CRM 2011, и все в порядке, эта проблема характерна для CRM 2013.

ИЗМЕНИТЬ:

  • Этот код запускается пользовательской кнопкой ленты.
  • Мы попытались изменить фокус на другой элемент управления, а затем проверили значение, оно не работает.

ИЗМЕНИТЬ:

  • Эта проблема возникает только в том случае, если поле является полем required.

введите здесь описание изображения


person Yaqub Ahmad    schedule 12.11.2013    source источник
comment
Итак, откуда вызывается ваш код?   -  person andriikulyk    schedule 12.11.2013
comment
Не могу воспроизвести ошибку. Я надеюсь, что у вас нет значения, жестко запрограммированного где-либо в вашем javascript.   -  person Scorpion    schedule 12.11.2013
comment
Странный!! Я могу воспроизвести это в консоли браузера....   -  person Yaqub Ahmad    schedule 12.11.2013
comment
Хорошо, я не знал, что вы используете JS в консоли браузера. Вы пробовали тот же JS для необязательных полей? Может быть, он автоматически фокусируется на поле ошибки. Я только предполагаю :)   -  person Scorpion    schedule 12.11.2013
comment
Я использую код с кнопки ленты, выше приведена упрощенная версия этого кода. Тот же код отлично работает для необязательных полей.   -  person Yaqub Ahmad    schedule 12.11.2013


Ответы (2)


Логика страницы CRM заключается в том, что она изменяет данные внутри объекта Xrm.Page.data только в том случае, если редактируемое поле теряет фокус (это событие сообщает CRM, что ввод данных выполнен), поэтому может случиться так, что после шага 4 вы не не потерять фокус на другом поле. Это поведение такое же, как в CRM 2011.

person andriikulyk    schedule 12.11.2013
comment
и как можно выполнить код javascript (внутри другого события onchange/onsave) без потери фокуса элемента управления? по магии? он выполнил код javascript, поэтому поле потеряло фокус. - person Guido Preite; 12.11.2013
comment
Не вижу, где он выполнил оператор Xrm.Page.getAttribute(subject).getValue(). Я сделал это в консоли браузера и воспроизвел проблему. В CRM 2011 это можно воспроизвести с помощью скрипта кнопки ленты. - person andriikulyk; 12.11.2013
comment
конечно, если вы выполните в консоли браузера, вы получите предыдущее значение, потому что поле не потеряло фокус, но в обычном поведении, если вы выполните другой код javascript onchange/onsave, вы всегда потеряете фокус текущего элемента управления. Потому что он выполняет свой второй getValue в другой позиции (или для onchage того же элемента управления) и он получает значение, означает, что поле потеряло фокус или javascript вообще не будет выполнен. (и, как он сказал, такое поведение происходит только с CRM 2013, потому что то же самое для него работает в CRM 2011) - person Guido Preite; 12.11.2013
comment
Я уже пытался переместить фокус на другой элемент управления, но это не работает, извините, я не упомянул об этом в своем первоначальном вопросе; Я изменил свой вопрос сейчас. - person Yaqub Ahmad; 12.11.2013

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


Проблема 1: JavaScript считывает предыдущее значение при вводе пустого значения.

Я думаю, что это то же самое, что и исходная проблема этого поста. Это также размещено по адресу: http://partnersupport.microsoft.com/en-us/mpndynamics/forum/mpndyncrm/javascript-reads-previous-value-when-an-empty/f7b8dffd-3a21-48ae.-8dca-4c5467ea8272

В форме конкурента.
Введите «Оливер» в поле имени.
Затем прочитайте его в JavaScript, как показано ниже.

function ClickHandler()
{
    var nameValue = "";
    nameValue = locationValue = parent.Xrm.Page.getAttribute("name").getValue();   
   
    var test1 = "";
}
 

Вы должны получить «Оливер», как и ожидалось.
Затем вернитесь к форме участника и вручную удалите текст с помощью клавиши Backspace.
Теперь прочитайте, что находится в поле имени с помощью JavaScript, как это было сделано ранее.
Вы не ожидали получить ничего, но получили «Оливер».
Теперь введите «Отметить» в поле имени.
Прочтите поле с помощью JavaScript, и вы получите «Отметить», как и должно быть.
Так кажется, когда пустое значение вводится после предыдущего значения, JavaScript считывает предыдущее значение.
Другими словами. Кажется, что есть проблема, если поле Имя имеет значение, а текст затем удаляется вручную. Объект Xrm.Page не будет обновляться до пустой строки. Однако объект Xrm.Page будет обновлен до непустого значения.



Проблема 2: Javascript не может прочитать значение в текстовом поле, если поле не потеряло фокус.

Это также опубликовано на странице http://partnersupport.microsoft.com/en-us/mpndynamics/forum/mpndyncrm/javascript-cannot-read-the-value-in-the-text-field/ecc2c9e0-fba0-44f2-93cd-320d042896f0?tm=1389885238744

Javascript не может прочитать значение в текстовом поле, если поле не потеряло фокус.
В форме повторяющейся встречи у меня есть IFRAME, который запускает Javascript. Он считывает значение в поле местоположения при нажатии кнопки. Если я изменю значение в поле местоположения, чтобы сказать «Брансуик-стрит», и нажму кнопку, я ничего не прочитаю (т.е. в приведенном ниже коде значение местоположения равно нулю). Однако, если я изменю значение в поле местоположения, чтобы сказать Брансуик-стрит. Затем я щелкаю где-нибудь в форме, отличной от IFRAME, чтобы поле местоположения потеряло свой фокус (это также можно сделать, нажав клавишу ввода/вкладки после ввода текста в поле местоположения). Если я затем нажму кнопку в IFRAME, Javascript правильно прочитает текст в поле местоположения.
Я полагаю, что это связано с тем, что parent.Xrm.Page обновляется только тогда, когда фокус теряется в поле.

function ClickHandler()
{
    var locationValue = parent.Xrm.Page.getAttribute("location").getValue();
}

Я попытался изменить фокус в JavaScript, установив его в поле requiredattendees. Но это не сработало.

parent.Xrm.Page.getControl("requiredattendees").setFocus();

Раньше я использовал parent.document.forms[0].namedItem(srcDataFlds[fld]).value; чтобы получить значение в CRM 4 и 2011, но это не работает в CRM 2013. Поэтому, как предложил SDK, я изменил код, чтобы использовать parent.Xrm.Page, однако, похоже, это создает проблему выше.

Вопросы в том, почему фокус не теряется, когда я нажимаю кнопку на IFRAME? Если я нажму на любое поле в форме, фокус изменится, так почему бы не IFRAME. Кроме того, как я могу заставить JavaScript читать значение в поле местоположения без необходимости щелкать вдали от поля местоположения. (Надеюсь, прочитать значение поддерживаемым способом)? Я просто хочу, чтобы пользователь мог ввести значение в поле местоположения и нажать кнопку в IFRAME. Я также заметил, что когда вы щелкаете IFRAME, событие On Change не запускается для поля местоположения.
Пока что единственный способ обойти это — щелкнуть другое поле (или нажать Enter/Tab) перед нажатием кнопки, которая запускает Javascript.

Обе эти проблемы были обнаружены корпорацией Майкрософт и исправлены в «Накопительном пакете обновления 1 для Microsoft Dynamics CRM 2013 с пакетом обновления 1».

person Oly    schedule 02.06.2014