【问题标题】:SSRS 2008 R2 - SSRS 2012 - ReportViewer: Reports are blank in Safari and ChromeSSRS 2008 R2 - SSRS 2012 - ReportViewer:报告在 Safari 和 Chrome 中为空白
【发布时间】:2011-05-11 17:16:51
【问题描述】:

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

【问题讨论】:

标签: reporting-services ssrs-2008 reportviewer ssrs-2012 reporting-services-2012


【解决方案1】:

终极解决方案(也适用于 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。如果此解决方案不起作用,请在浏览器中查看 HTML 以查看脚本是否正常工作,将 overflow:auto 属性更改为 overflow:visible


ReportViewer 控件的解决方案

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

#reportViewer_ctl09 {
  overflow:visible !important;
 }

原因

Chrome 和 Safari 以与 IE 不同的方式呈现 overflow:auto

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 的开发工具 (F12) 在生成的网页中手动将 overflow:auto 更改为 overflow:visible 来查看有关 Chrome 的报告。


我喜欢Tim's solution,它既简单又有效。

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

This technote detail 说明问题所在:

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

用户einarq建议this solution

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

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

【讨论】:

  • 我将函数 page_load 更改为 pageLoad 以触发脚本。否则,它似乎可以解决 Chrome 13 中的渲染问题。不幸的是,SSRS 中的基本身份验证似乎不适用于 Safari 5.1,所以我无法在那里验证。
  • 原因是错误的。真正的原因是,SSRS HTML 是 QuirksMode HTML 并且依赖于 IE 5.5 的错误。非 IE 浏览器没有 IE quirksmode,因此可以正确呈现 HTML。对于没有在 QuirksMode 中模拟 IE 5.5 错误的浏览器,它缺少设置表格宽度...顺便说一下,这也适用于 IE 10,因为它有一个新的 default-quirksmode 模式。
  • 完美运行。但是对于 SQL Server 2012,有问题的 div id 是ctl32_ctl09
  • 而不是搜索 id ctl32_ctl09 或生成的任何内容,尝试:document.querySelector("[id^=VisibleReportContent]").parentNode;
  • @JustinMangum - 在 IE 的兼容性视图中使用 querySelector 将失败,这几乎可以肯定已为 Intranet SSRS 站点启用。症状是加载对话框永远不会关闭,因此用户将无法查看任何报告。
【解决方案2】:

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

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

【讨论】:

  • 我不知道为什么这不是公认的解决方案,因为 a) 它工作正常,并且 b) 它似乎是内置解决方案。不是让reportviewer 正常工作的技巧。并不是说入侵 ReportViewer 以使其工作有什么问题。似乎整个 reportviewer 都在搞大黑客攻击。
  • 这个解决方案不只适用于在应用程序中嵌入 ReportViewer 控件吗?如果这适用于报表管理器并且报表从 ReportServer URL 运行,那么请指定您需要在何处包含此编辑。
  • 您指的是 \SQL\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Pages\ReportViewer.aspx 中的以下行:
  • 可能可以正常工作,但是如果您在报告中有 很多 图像(指标/迷你图),则会导致渲染超时惨不忍睹。
  • 这在 SSRS 2012 中修改 ReportViewer.aspx 时不起作用。
【解决方案3】:

我正在使用带有 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";         
    } 
}

【讨论】:

  • 此解决方案在我们的环境中运行良好。谢谢迈克
【解决方案4】:

这是known issue。问题是 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);
}

注意

似乎有一个 solution for SSRS 2005 我没有尝试过,但我认为它不适用于 SSRS 2008,因为我找不到“Doc​​MapAndReportFrame”类。

【讨论】:

  • 有一件事我不明白。如果你在\ReportingServices.js中应用代码函数FixSari,然后你执行代码在SSRS中显示报告,你在哪里应用函数来执行FixSafari的源方法代码?如果我理解正确,会生成 ReportingServices.js 的原始代码,最后执行 FixSafari 代码?
【解决方案5】:

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

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 - 上述解决方案使用子选择器来找到正确的 div。它从具有更静态 id 属性的链更高的项目开始,然后将子项沿着树向下移动到所需的 div。我希望它为变量使用更具描述性、更少重载的名称,但这是一个很好的解决方案。建议名称:reportPayloadElement.
【解决方案6】:

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

无论报表服务器将输出什么用于表的“id”属性,它都应该工作。我不认为你总是可以假设它是“ctl31_fixedTable”

我结合了上面的建议和一些方法,从找到的 javascript 文件 here 将 jquery 库动态加载到页面中

在服务器上转到目录: 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);
【解决方案7】:

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

【讨论】:

    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      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";
          }
      }
      

      【讨论】:

        【解决方案10】:

        我用过这个。在 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');
                            });
                        });
                    }
                });
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2011-07-22
          • 1970-01-01
          • 2011-11-23
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多