我将我们的报告服务从 2008 版本迁移到另一个服务器版本 2008 R2。在 2008 版中,报告在 Safari 上运行良好。新版本 2008 R2 报告根本不显示。我看到的只是参数部分,然后报告是空白的。在 Chrome 中也是如此。根据 Microsoft Safari 的说法,如果以有限的方式支持。报告并不复杂。事实上,我创建了一个报告,上面只有一行,以查看它是否会显示在 Safari 中,但不会,该报告也是完全空白的。有没有人让 SSRS 报告在 Safari 上可见?我是否必须弄乱某种配置设置?
10 回答
终极解决方案(也适用于 SSRS 2012!)
将以下脚本附加到以下文件(在 SSRS 服务器上)
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js
function pageLoad() {
var element = document.getElementById("ctl31_ctl10");
if (element)
{
element.style.overflow = "visible";
}
}
注意:正如 azzlak 所指出的,div 的名称并不总是ctl31_ctl10
. 对于 SQL 2012 tryctl32_ctl09
和对于 2008 R2 try ctl31_ctl09
。如果此解决方案不起作用,请在浏览器中查看 HTML 以查看脚本是否正常工作,将overflow:auto
属性更改为overflow:visible
.
ReportViewer控件解决方案
将此样式行插入.aspx
页面(或链接.css
文件,如果有)
#reportViewer_ctl09 {
overflow:visible !important;
}
原因
Chrome 和 Safarioverflow:auto
以不同的方式呈现 IE。
SSRS HTML 是 QuirksMode HTML 并且依赖于 IE 5.5 错误。非 IE 浏览器没有 IE quirksmode,因此可以正确呈现 HTML
SSRS 2008 R2 报表生成的 HTML 页面包含一个div
样式overflow:auto
,它将报表变成一个不可见的报表。
<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">
我可以通过使用 Chrome 的开发工具 ( )在生成的网页中手动更改overflow:auto
为来查看有关 Chrome 的报告。overflow:visible
F12
我喜欢Tim 的解决方案,它既简单又有效。
但是还有一个问题:任何时候用户更改参数(我的报告使用参数!)AJAX 刷新 div,overflow:auto标记被重写,并且没有脚本更改它。
此技术说明详细说明了问题所在:
这是因为在使用 AJAX 面板构建的页面中,只有 AJAX 面板会更改其状态,而不会刷新整个页面。因此,
OnLoad
您在<body>
代码上应用的事件只会触发一次:第一次加载页面。之后,更改任何 AJAX 面板将不再触发这些事件。
用户 einarq 建议了这个解决方案:
另一种选择是将您的函数重命名为 pageLoad。如果页面上存在具有此名称的任何函数,asp.net ajax 将自动调用它,每次部分更新后也是如此。如果这样做,您还可以从 body 标记中删除 onload 属性
因此编写了解决方案中显示的改进脚本。
只需包括SizeToReportContent="true"
如下所示
<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
我正在使用带有 SQL 2008 R2 SP1 的 Chrome 版本 21,并且上述修复均不适合我。下面是确实有效的代码,与其他答案一样,我将这段代码添加到 Append to "C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js"(在SSRS 服务器):
//Fix to allow Chrome to display SSRS Reports
function pageLoad() {
var element = document.getElementById("ctl31_ctl09");
if (element)
{
element.style.overflow = "visible";
}
}
这是一个已知问题。问题是 div 标签的样式为“overflow: auto”,这显然无法与 Safari 和 Chrome 使用的 WebKit 很好地实现(参见 Emanuele Greco 的回答)。我不知道如何利用 Emanuele 的建议来使用 RS:ReportViewerHost 元素,但我使用 JavaScript 解决了它。
问题
解决方案
由于在 id 为“ctl31_ctl10”的 div 元素的样式属性中指定了“overflow: auto”,因此我们无法在样式表文件中覆盖它,所以我求助于 JavaScript。我将以下代码附加到“C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js”
function FixSafari()
{
var element = document.getElementById("ctl31_ctl10");
if (element)
{
element.style.overflow = "visible"; //default overflow value
}
}
// Code from http://stackoverflow.com/questions/9434/how-do-i-add-an-additional-window-onload-event-in-javascript
if (window.addEventListener) // W3C standard
{
window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
}
else if (window.attachEvent) // Microsoft
{
window.attachEvent('onload', FixSafari);
}
笔记
似乎有一个我没有尝试过的 SSRS 2005 解决方案,但我认为它不适用于 SSRS 2008,因为我找不到“DocMapAndReportFrame”类。
我的解决方案基于上述想法。
function pageLoad() {
var element = document.querySelector('table[id*=_fixedTable] > tbody > tr:last-child > td:last-child > div');
if (element) {
element.style.overflow = "visible";
}
}
它不限于某个 id,而且您不需要包含任何其他库,例如 jQuery。
这是我用于 Report Server 2008 R2 的解决方案
无论报表服务器将输出什么用于表的“id”属性,它都应该工作。我认为您不能总是假设它将是“ctl31_fixedTable”
我混合使用了上面的建议和一些方法来将 jquery 库从此处找到的 javascript 文件动态加载到页面中
在服务器上转到目录:C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js
将jquery库jquery-1.6.2.min.js复制到目录下
创建文件 ReportingServices.js 的备份副本 编辑文件。并将其附加到它的底部:
var jQueryScriptOutputted = false;
function initJQuery() {
//if the jQuery object isn't available
if (typeof(jQuery) == 'undefined') {
if (! jQueryScriptOutputted) {
//only output the script once..
jQueryScriptOutputted = true;
//output the script
document.write("<scr" + "ipt type=\"text/javascript\" src=\"../js/jquery-1.6.2.min.js\"></scr" + "ipt>");
}
setTimeout("initJQuery()", 50);
} else {
$(function() {
// Bug-fix on Chrome and Safari etc (webkit)
if ($.browser.webkit) {
// Start timer to make sure overflow is set to visible
setInterval(function () {
var div = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
div.css('overflow', 'visible');
}, 1000);
}
});
}
}
initJQuery();
你可以用 jQuery 轻松解决这个问题——还有一点丑陋的 hack :-)
我有一个带有 ReportViewer 用户控件的 asp.net 页面。
<rsweb:ReportViewer ID="ReportViewer1" runat="server"...
然后在文档就绪事件中,我启动一个计时器并查找需要溢出修复的元素(如以前的帖子):
<script type="text/javascript">
$(function () {
// Bug-fix on Chrome and Safari etc (webkit)
if ($.browser.webkit) {
// Start timer to make sure overflow is set to visible
setInterval(function () {
var div = $('#<%=ReportViewer1.ClientID %>_fixedTable > tbody > tr:last > td:last > div')
div.css('overflow', 'visible');
}, 1000);
}
});
</script>
比假设它有一个特定的 ID 更好。您可以根据自己的喜好调整计时器。我在这里将其设置为 1000 毫秒。
仅供参考 - 在 2012 SP1 中,上述方法均不适用于我......简单的解决方案是将凭据嵌入共享数据源中,然后告诉 Safari 信任 SSRS 服务器站点。然后效果很好!花了几天时间寻找上述所谓的解决方案,却发现集成的安全性在 Safari 上无法可靠地工作——你必须弄乱 Mac 上的钥匙串,然后仍然无法可靠地工作。
Emanuele 提供的解决方案对我有用。当我直接从服务器访问它时,我可以看到报告,但是当我在我的 aspx 页面上使用 ReportViewer 控件时,我无法看到报告。在检查呈现的 HTML 时,我发现了一个 ID 为“ReportViewerGeneral_ctl09”的 div(ReportViewerGeneral是报表查看器控件的服务器 ID),它的溢出属性设置为 auto。
<div id="ReportViewerGeneral_ctl09" style="height: 100%; width: 100%; overflow: auto; position: relative; ">...</div>
我使用 Emanuele 解释的程序将其更改为可见,如下所示:
function pageLoad() {
var element = document.getElementById("ReportViewerGeneral_ctl09");
if (element) {
element.style.overflow = "visible";
}
}
我用过这个。在 Report.aspx 页面上添加对 jquery 的脚本引用。使用以下将 JQuery 链接到 Microsoft 事件。使用了一点 Eric 的建议来设置溢出。
$(document).ready(function () {
if (navigator.userAgent.toLowerCase().indexOf("webkit") >= 0) {
Sys.Application.add_init(function () {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (!prm.get_isInAsyncPostBack()) {
prm.add_endRequest(function () {
var divs = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
divs.each(function (idx, element) {
$(element).css('overflow', 'visible');
});
});
}
});
}
});