85

我将我们的报告服务从 2008 版本迁移到另一个服务器版本 2008 R2。在 2008 版中,报告在 Safari 上运行良好。新版本 2008 R2 报告根本不显示。我看到的只是参数部分,然后报告是空白的。在 Chrome 中也是如此。根据 Microsoft Safari 的说法,如果以有限的方式支持。报告并不复杂。事实上,我创建了一个报告,上面只有一行,以查看它是否会显示在 Safari 中,但不会,该报告也是完全空白的。有没有人让 SSRS 报告在 Safari 上可见?我是否必须弄乱某种配置设置?

4

10 回答 10

110

终极解决方案(也适用于 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:visibleF12


我喜欢Tim 的解决方案,它既简单又有效。

但是还有一个问题:任何时候用户更改参数(我的报告使用参数!)AJAX 刷新 div,overflow:auto标记被重写,并且没有脚本更改它。

此技术说明详细说明了问题所在:

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

用户 einarq 建议了这个解决方案

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

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

于 2011-08-29T10:42:48.127 回答
27

只需包括SizeToReportContent="true"如下所示

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
于 2012-11-23T05:50:45.253 回答
23

我正在使用带有 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";         
    } 
}
于 2012-08-22T19:36:32.660 回答
14

这是一个已知问题。问题是 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,因为我找不到“Doc​​MapAndReportFrame”类。

于 2011-08-12T16:39:39.497 回答
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。

于 2015-01-17T19:51:14.713 回答
11

这是我用于 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();
于 2012-09-19T19:07:34.577 回答
4

你可以用 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 毫秒。

于 2011-09-08T07:00:16.047 回答
3

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

于 2014-03-11T23:21:17.947 回答
2

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";
    }
}
于 2012-10-03T06:55:19.483 回答
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');
                    });
                });
            }
        });
    }
});
于 2013-04-08T14:36:21.107 回答