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,因为我找不到“DocMapAndReportFrame”类。
这是我用于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'); }); }); } }); } });