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


84

我将报告服务从2008版迁移到另一个服务器2008 R2版。在2008版中,报告可以在Safari上正常运行。新版本的2008 R2报告完全不显示。我所看到的只是参数部分,然后报告为空白。在Chrome中也一样。根据Microsoft的说法,如果受限制,则Safari IS受支持。报告并不复杂。实际上,我创建了一个仅在一行上显示的报告,以查看它是否可以在Safari中显示,但没有,该报告也完全空白。是否有人在Safari上显示SSRS报告?我是否需要弄乱某种配置设置?


Answers:


109

终极解决方案(也可在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 2012ctl32_ctl09和2008 R2,请尝试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:autooverflow:visible,可以查看有关Chrome的报告F12


我喜欢蒂姆的解决方案,它很简单而且很有效。

但是仍然存在一个问题:用户每次更改参数(我的报告使用参数!)时,AJAX都会刷新div,重写overflow:auto标签,而没有脚本会对其进行更改。

此技术说明详细信息解释了问题所在:

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

用户einarq建议此解决方案

另一个选择是将函数重命名为pageLoad。如果页面上存在此名称的任何函数,则在每次部分更新之后,asp.net ajax也会自动调用该函数。如果这样做,您也可以从body标签中删除onload属性

因此写了解决方案中显示的改进脚本。


1
我将函数page_load更改为pageLoad以便触发脚本。否则,它似乎可以解决Chrome 13中的渲染问题。不幸的是,SSRS中的基本身份验证似乎不适用于Safari 5.1,因此我无法在那里进行验证。
kermatt 2011年

原因是错误的。真正的原因是,SSRS HTML是QuirksMode HTML,并且取决于IE 5.5错误。非IE浏览器没有IE quirksmode,因此可以正确呈现HTML。对于没有在其QuirksMode中模拟IE 5.5错误的浏览器,它缺少设置表的宽度...顺便说一下,这也适用于IE 10,因为它具有新的default-quirksmode模式。
Stefan Steiger 2013年

8
完美运作。但对于SQL Server 2012,令人讨厌的div ID为ctl32_ctl09
azzlack 2013年

3
而不是搜索id ctl32_ctl09或生成的ID,请尝试:document.querySelector(“ [id ^ = VisibleReportContent]”)。parentNode;
帕拉

1
@JustinMangum-在兼容性视图的IE中,无法在IE中使用querySelector,几乎可以肯定对Intranet SSRS站点启用了它。症状是“加载”对话框将永远不会关闭,因此用户将无法查看任何报告。
迈克

27

仅包括SizeToReportContent="true"如下所示

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

4
我不知道为什么这不是可接受的解决方案,因为a)效果很好,b)似乎是内置的解决方案。不能使Reportviewer正常工作。骇入ReportViewer使其正常工作并不意味着有任何问题。似乎整个reportviewer都处于大黑客状态。
Raif 2013年

3
此解决方案不只适用于将ReportViewer控件嵌入到应用程序中吗?如果这适用于报表管理器,并且报表是从ReportServer URL运行的,则请指定需要在何处进行此编辑。
注册用户

2
您是否在\ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx中引用以下行:<RS:ReportViewerHost ID =“ ReportViewerControl” runat =“ server” />
注册用户

1
可以工作得很好,但如果你有很多的报表上的图像(指标/迷你)它会打击渲染时间了残暴。
Trubs 2015年

1
这在2012年SSRS修改ReportViewer.aspx时不起作用
基思

23

我正在将Chrome版本21与SQL 2008 R2 SP1配合使用,但以上修复程序均不适用于我。下面是起作用的代码,与其他答案一样,我将这部分代码添加到“ 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";         
    } 
}

1
该解决方案在我们的环境中运行良好。感谢Mike
Vince Perta

14

这是一个已知问题。问题在于div标签的样式为“ overflow:auto”,显然不能与Safari和Chrome使用的WebKit很好地实现(请参阅Emanuele Greco的回答)。我不知道如何利用Emanuele的建议来使用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解决方案,但我认为它不适用于SSRS 2008,因为找不到“ DocMapAndReportFrame”类。


2
我不明白一件事。如果在\ ReportingServices.js中应用代码功能FixSari,然后执行代码以在SSRS中显示报告,那么在哪里应用该功能为FixSafari执行源方法代码?如果我理解正确,那么将生成ReportingServices.js的原始代码,最后执行FixSafari代码吗?
WhatsUP 2013年

12

我的解决方案基于上述想法。

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)。


但是其他所有人都针对的元素(例如ctl31_ctl10及其变体)不一定包含_fixedTable。我想念什么吗?
Baodad '16

@Baodad-以上解决方案使用子选择器来查找正确的div。它基于链上较高,具有更静态id属性的项开始,然后将子项沿树向下移动到所需的div。我希望它为该变量使用一个更具描述性,重载较少的名称,但这是一个很好的解决方案。建议名称:reportPayloadElement。
布赖恩·斯威夫特

11

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

无论Report Server在其表的“ 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();

但是,有一个问题,如果页面上有多个报告表,这是否会导致控件的多次加载?如果是这样,则可以将第一行更改为:var jQueryScriptOutputted =(((typeof(jQueryScriptOutputted)=='undefined')?false:true);
rmcsharry12年

4

您可以使用jQuery轻松解决此问题-以及一些难看的技巧:-)

我有一个带有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毫秒。


3

仅供参考-在2012 SP1中,上述所有方法都不适合我...简单的解决方案是将凭据嵌入共享数据源中,然后告诉Safari信任SSRS服务器站点。然后效果很好!花了几天时间追逐上述假定的解决方案,只是为了发现集成安全性在Safari上无法可靠地工作-您必须弄乱Mac上的钥匙串,然后仍然无法可靠地工作。


2

Emanuele提供的解决方案对我有用。当我直接从服务器访问报表时,可以看到该报表,但是当我在aspx页面上使用ReportViewer控件时,无法看到该报表。检查呈现的HTML后,我发现了一个id为“ ReportViewerGeneral_ctl09”的div(ReportViewerGeneral是报表查看器控件的服务器ID),其overflow属性设置为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";
    }
}

2

我已经用过了 在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');
                    });
                });
            }
        });
    }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.