SSRS 2008 R2 – SSRS 2012 – ReportViewer:Safari和Chrome中的报告为空白

我将我们的报告服务从2008版迁移到另一个服务器版2008 R2。 在2008版本中,这些报告在Safari上运行良好。 新版本2008 R2的报告根本没有显示出来。 所有我看到的是参数部分,然后报告是空白的。 在Chrome中一样。 据微软Safari IS支持,如果以有限的方式。 这些报告并不复杂。 事实上,我创build了一个报告,只有一行,看看它是否会出现在Safari浏览器,但不,该报告是完全空白的。 有没有人使Safari上的SSRS报告可见? 我必须弄乱某种configuration设置吗?

终极解决scheme(也在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,请尝试ctl32_ctl09 ,对于2008 R2,请尝试ctl31_ctl09 。 如果这种解决scheme不起作用,请查看浏览器中的HTML代码,看看脚本是否正确地更改了overflow:auto属性overflow:visible


ReportViewer控件的解决scheme

插入.aspx页面(或链接的.css文件,如果可用)此样式行

 #reportViewer_ctl09 { overflow:visible !important; } 

原因

Chrome和Safari呈现overflow:auto以不同的方式尊重IE。

SSRS HTML是QuirksMode HTML并依赖于IE 5.5的错误。 非IE的浏览器没有IE的quirksmode,因此正确地呈现HTML

由SSRS 2008 R2报告生成的HTML页面包含一个具有overflow:auto样式的div ,并将报告变成不可见的报告。

 <div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;"> 

我可以通过手动更改overflow:auto overflow:visible使用Chrome的开发工具( F12 )在制作的网页中看到关于Chrome的报告。


我爱蒂姆的解决scheme ,这很容易,工作。

但仍然有一个问题:用户随时更改参数(我的报告使用参数!)AJAX刷新div, 溢出:自动标记被重写,没有脚本改变它。

这个技术细节解释了什么是问题:

发生这种情况是因为在使用AJAX面板构build的页面中,只有AJAX面板会更改其状态,而不刷新整个页面。 因此,您在<body>标记上应用的OnLoad事件只会触发一次:第一次加载页面。 之后,更改任何AJAX面板将不会再触发这些事件。

用户einarq提出了这个解决scheme :

另一种select是将你的函数重命名为pageLoad。 任何具有这个名字的函数都会被asp.net ajax自动调用,如果它存在于页面上的话,也是每次部分更新之后。 如果你这样做,你也可以从body标签中删除onload属性

所以写了解决scheme中显示的改进脚本。

只需包含SizeToReportContent="true" ,如下所示

 <rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"... 

我正在使用SQL 2008 R2 SP1的Chrome版本21,以上都没有为我工作。 下面是代码工作,与其他答案我添加了这一点的代码附加到“C:\ Program Files文件\ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \报告服务\ 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的build议来使用RS:ReportViewerHost元素,但我使用JavaScript解决了这个问题。

问题

在这里输入图像描述

由于在ID为“ctl31_ctl10”的div元素的style属性中指定了“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的解决scheme ,我还没有尝试,但我不认为它适用于SSRS 2008,因为我找不到“Doc​​MapAndReportFrame”类。

这是我用于Report Server 2008 R2的解决scheme

它应该工作,无论报表服务器将在其“id”属性中使用哪个输出。 我不认为你总是可以假设它会是“ctl31_fixedTable”

我使用了上面的build议和一些方法来dynamic加载jquery库到从这里find的JavaScript文件的页面的混合

在服务器上转到目录:C:\ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

将jquery库jquery-1.6.2.min.js复制到目录中

创build文件的备份副本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(); 

我的解决scheme基于上面的想法。

 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。

你可以用jQuery轻松解决这个问题 – 还有一点难看的破解:-)

我有一个ReportViewer用户控件的asp.net页面。

  <rsweb:ReportViewer ID="ReportViewer1" runat="server"... 

在准备就绪的事件中,我启动一个计时器并查找需要溢出修复的元素(如以前的post):

  <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 …简单的解决scheme是将凭证embedded共享数据源,然后告诉Safari信任SSRS服务器站点。 然后它工作得很好! 花了好几天的时间去追求像上面这样的解决scheme,才发现集成的安全性在Safari上不能可靠地工作 – 你必须在Mac上弄乱钥匙链,然后仍然不能可靠地工作。

Emanuele提供的解决scheme为我工作。 当我直接从服务器访问报表时,我可以看到报表,但当我在我的aspx页面上使用ReportViewer控件时,我无法看到报表。 在检查呈现的HTML后,我发现了一个ID为“ReportViewerGeneral_ctl09”( ReportViewerGeneral是报表查看器控件的服务器ID)的div,并将其溢出属性设置为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事件。 用一点埃里克的build议来设置溢出。

 $(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'); }); }); } }); } });