- PVSM.RU - https://www.pvsm.ru -
Недавно столкнулся с необходимостью показать в отчете SSRS 2008 R2 HTML-таблицы, хранящиеся в базе данных.
И здесь на сцену статисты выносят заботливо подготовленные «грабли». Все дело в том, что Report Manager в SSRS 2008 R2 поддерживает только ограниченное количество тегов HTML, и табличные в их число не входят.
Согласно официальной документации, поддерживаются только следующие теги:
Список атрибутов CSS также сильно урезан.
После продолжительного поиска в интернете, стало понятно, что ни один из вариантов, предлагаемых сообществом разработчиков, меня не устроит.
Варианты предлагались следующие:
В одном из обсуждений натолкнулся на подсказку — Javascript на стороне клиента. Готового решения не было.
Начал с попыток проанализировать какой код выполняется на стороне клиента при отображении отчета. Подсмотрел в код отчета в браузере и нашел внедренный скрипт ReportingServices.js:
<script language="JScript" src="/Reports_SQLEXPRESS/js/ReportingServices.js" type="text/Javascript"></script>
Сам скрипт у меня на сервере лежал здесь:
c:Program FilesMicrosoft SQL ServerMSRS10_50.SQLEXPRESSReporting ServicesReportManagerjsReportingServices.js
Нашел пару статей на тему Javascript-инъекции с помощью данного скрипта, но основная проблема была в том, что мои модификации выполнялись только один раз при отображении первой страницы отчета, и при переходе на следующие страницы интерфейсные элементы уже не перерисовывались (AJAX).
Попытки глубже разобраться в принципах работы SSRS продолжились изучением фрагментов кода основных DLL-ей сервера с помощью DevExtras CodeReflect и препарированием отчетов в IE9 developer tool/Opera Dragonfly.
В результате нашел следующее:
Для того чтобы добавить свой обработчик — нужно создать JS-функцию pageLoad, которая автоматически будет выполняться при возникновении события Load:
function pageLoad(sender, args) {
//здесь наш код, например alert("Работает!");
}
Вставляю данную конструкцию в самое начало скрипта ReportingServices.js. Работает!
Собственно, дальше уже головоломка собралась и получилось следующее решение:
function pageLoad() {
var toDecode = document.getElementsByTagName("div"); // получаем все DIVы
for (var i = 0; i < toDecode.length; ++i){ // перебираем
if(toDecode[i].innerHTML.indexOf("HTMLInject:") == 0){ // DIV содержит префикс?
Decoded = toDecode[i].innerText || toDecode[i].textContent; // поддержка IE, Opera, FF
toDecode[i].innerHTML = Decoded.slice(11); // вырезаем префикс & TXT --> HTML
}
}
}
="HTMLInject:"+Fields!FieldName.Value
, где FieldName — имя поля датасета, содержащего HTML.
При этом свойство «GeneralMarkup type» самого поля нужно поставить в значение "None — Plain text only".
Так по-умолчанию показывается поле («None — Plain text only»):
Так показывает таблицы, если тип разметки поставить в «HTML — Interpret HTML tags as styles»:
Мой вариант:
Достоинства:
Недостатки:
Вот так, с помощью нехитрых приспособлений, можно научить SSRS показывать HTML… Но ЗАЧЕМ?!
Сотни постов, от растерянных до гневных, переполняют интернеты из-за такой мелочи.
Даже BIRT [2] это уже давно умеет, а новейшая версия SSRS2012 еще нет (пруфлинк: http://technet.microsoft.com/en-us/library/ff519562.aspx [3]).
Есть мысли, что MS реализовала показ HTML в таком ограниченном виде чтобы не пострадала безопасность/стабильность системы отчетности, но похоже, что все альтернативные решения напоминают пресловутый «троллейбус».
Автор: Cyr
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/6147
Ссылки в тексте:
[1] http://msdn.microsoft.com/en-us/library/bb386417.aspx: http://msdn.microsoft.com/en-us/library/bb386417.aspx
[2] BIRT: http://www.eclipse.org/birt
[3] http://technet.microsoft.com/en-us/library/ff519562.aspx: http://technet.microsoft.com/en-us/library/ff519562.aspx
Нажмите здесь для печати.