SSRS Report Viewer控制浏览器兼容性

时间:2009-02-27 20:16:52

标签: reporting-services

MS Report Viewer Control与Firefox和Safari等浏览器的兼容性如何?

如果您知道SSRS的任何第三方报告查看者,请发布。

7 个答案:

答案 0 :(得分:26)

修改 - 2016/2017更新

SSRS 2016+可以说是跨浏览器兼容的。
表格边框在IE10中没有正确显示,但IE10无论如何都要消失。
在其他浏览器中,它没问题。

您仍然需要注册add_pageLoaded来翻译参数提示。

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () { fixReportingServices('rpt-container'); });

此外,与版本< 2016年,您需要将PageCountMode="Actual"添加到RS:ReportViewerHost控件。

<RS:ReportViewerHost ID="ReportViewerControl" PageCountMode="Actual" runat="server" />

如果您想拥有有意义的分页号码。

此外,在使用datepickers在查询字符串中设置语言时也存在问题(SSRS&lt; 2016也是如此)。如果希望datepicker使用非浏览器语言,则需要将context.Request.UserLanguages[i]设置为HTTP模块中context.BeginRequest中查询字符串中指定的语言。

此外,如果要安全地在Internet中的iframe中使用SSRS,则需要在每个HTTP响应中添加X-Frame-Options和Content-Security-Policy HTTP-header。请参阅my github-repository for details

</EndEdit>

预2016:

我可以告诉你,我有9年的该死的经验(SSRS 2005,SSRS 2008 R1&amp; R2,2012和SSRS 2014)。

让我向您保证,因为SSRS HTML报告依赖于IE5-Quirksmode,所以他们没有机会在Internet Explorer以外的任何浏览器中正确呈现(IE&lt; 10我可能倾向于添加)。< / p>

如果您拥有对报表服务器的管理员权限,并且我强调IF,您可以在ReportViewer页面上添加jQuery例程和CSS来纠正最基本的问题(比如你不会看到超过1厘米的问题)报告),但否则,HTML渲染仍然看起来非常可怕(边距,表格边框,图片填充,列大小,文本字段大小,标题和/或页面编号对齐等,简而言之 - 几乎任何事情)

当然,ActiveX打印机控件只能在InternetExplorer(在Windows上)上工作,因为只支持ActiveX。

我还向您保证,除了IE之外,绝对没有办法让ReportManager在任何其他浏览器中工作。

至于Internet Explorer支持,应该提到的是,从IE版本10开始,IE默认为webkit-quirksmode(出于兼容性原因)而不是IE5 quirksmode,因此呈现的HTML看起来与Chrome /同样可怕用于IE 10+的Firefox / Safari,除非您在ReportViewer.aspx页面中添加了与meta xua兼容的IE5。

后者可能不适用于Intranet,因为IE在Intranet站点上自动回退到IE 7兼容模式(但仅限于任何Windows版本&lt; 8 )。

在Windows 8中,localhost链接和计算机名链接(无法在stackoverflow帖子中添加http://)未分配到本地Intranet区域(可能是快速黑客,因此IE不会退回到IE7兼容模式),因此,Windows身份验证将失败。

还应该提到的是,无法为ReportManager添加与meta xua兼容的IE5,因为没有可以编辑的页面(已编译的不可更新的ASP.NET网站项目......)。
如果没有使用dev-tools在quirksmode中切换reportmanager,那么在IE 10 +中就无法使用ReportManager。

然后,另外要提一下的是,从IE9开始,IE从父页面继承了iframe元素的doctype,并且没有办法改变它(不将父页面改为所需的子页面) -page doc-mode)。

因此,如果你足够聪明地为报告使用iframe,因为在弹出窗口阻止程序时代,任何理智的人都不想要弹出窗口,报告页面将继承父页面的doctype。如果那不是IE5-QuirksMode,那么它将使报告与Safari / Chrome / Firefox / Opera上的任何IE一样糟糕&gt; 8,不管ReportViewer.aspx中任何可能的与meta xua兼容的ie5标记。

对于替代方案,免费且具有类似的功能集,只有Eclipse BIRT(幸运的是,HTML呈现并不相似)。

应该提到的是,BIRT虽然是根据Eclipse公共许可证授权的,但它使用的是SUN Java,因此您使用的是Oracle技术,该技术受各自许可条款的约束。 此外,您使用的是非Microsoft技术,Excel-Sheets BIRT渲染实际上是XML文件,在Office 2010 +中打开时会产生(谁会猜到)相当惊人的警告。

然后,收取相当大的费用,有http://www.stimulsoft.com个报告,Telerik报告 从它的技术外观来看,我推荐了stimulsoft报告,但是:免责声明,我没有使用其中任何一种,因为它们不是免费的。

至于替代SSRS渲染引擎(不是观众btw),只有www.fyireporting.com/,其中有一个分叉http://www.codeproject.com/Articles/138271/An-Open-Source-RDL-Engine

但是fyiReporting是不完整的并且正在进行中(如果没有放弃),所以我不会使用它。


最重要的是,如果你的产品是IE&amp;仅限Windows,Windows版本&lt; 8(并且不 - 不是&lt; =以防万一你已经注意了),在内联网中,从弹出窗口而不是iframe调用,然后使用SSRS。
对于其他任何事情,请使用stimulsoft报告(问题是,您必须重做所有报告,因为没有自动迁移 - 甚至不是非工作迁移)。

<强> PS:
通过添加&#34;一个小的javascript&#34;,我的意思是下面的东西(2008 R1版,赢得了2008R2 +的工作,可能在2005年工作,并注意你需要嵌入jQuery和jQuery Migrate in内联脚本标记,如果客户端PC无法访问http://ajax.aspnetcdn.com [注意:将脚本放入Pages文件夹并添加相对或绝对值链接赢了工作......]):

<%@ Register TagPrefix="RS" Namespace="Microsoft.ReportingServices.WebServer" Assembly="ReportingServicesWebServer" %>
<%@ Page Language="C#" AutoEventWireup="true" Inherits="Microsoft.ReportingServices.WebServer.ReportViewerPage" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<%= System.Web.HttpContext.Current.Request.Browser.Browser == "IE" && System.Globalization.CultureInfo.InvariantCulture.CompareInfo.IndexOf(System.Convert.ToString(System.Web.HttpContext.Current.Request.QueryString), "stylesheet", System.Globalization.CompareOptions.IgnoreCase) == -1 ? (System.Web.HttpContext.Current.Request.Browser.Browser != "IE" ? "": "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=5\">") : "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">" %>

    <head id="headID" runat="server">
    <title>Report Viewer</title>




    <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
    <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.migrate/jquery-migrate-1.1.0.min.js"></script>



    <script type="text/javascript">

        var bInFrameOrIframe = false;
        var iLanguageIndex = 0;
        var language = "DE_LOL";
        var UpdateLock = false;



        if (window.self === window.top) {
            // alert("true");
            // not in a frame 
            // Use IE5 quirksmode 
            //document.writeln('<meta http-equiv="X-UA-Compatible" content="IE=5" />');
            bInFrameOrIframe = false
        }
        else {
            // in a frame, FMS
            bInFrameOrIframe = true;
        }


        function TranslateParameterPrompts() {

            //mTo = false;
            $("table[id^='ParametersGridReportViewerControl'] span").each(function(index) {
                var strText = $(this).text();
                if (strText != null && strText.indexOf('/') != -1) {
                    strText = strText.split('/');
                    if (iLanguageIndex < strText.length)
                        strText = strText[iLanguageIndex];
                    else {
                        if (strText.length > 0)
                            strText = strText[0];
                    }

                    $(this).text(strText);
                }

            });

            //setTimeout(function(){mTo = true}, 5000);
        }


        function setTableSize() {
            //$("[id$='ReportViewerControl']")
            $(
                $(
                    $("#ReportFrameReportViewerControl")[0].contentWindow.document
                )
                .find("[id$='report']")[0].contentWindow.document.body
            ).find('*')
            .each(function() {
                //console.log("Processing an element");
            //var cls = $(this).attr("class");

            try {

                    // Don't add a border to sort-arrow
                    if ($(this).is('img')) {
                        return;
                    }


                    var anywidth = $(this).css('width');
                    var anywidth = parseFloat(anywidth);
                    //console.log("anywidth: " + anywidth);


                    //var lol = $(this).css('borderLeftWidth');
                    var blw = $(this).css('border-left-width');
                    var brw = $(this).css('border-right-width');
                    var btw = $(this).css('border-top-width');
                    var bbw = $(this).css('border-bottom-width');

                    var borls = $(this).css('border-left-style') == "solid";
                    var borrs = $(this).css('border-right-style') == "solid";
                    var borts = $(this).css('border-top-style') == "solid";
                    var borbs = $(this).css('border-bottom-style') == "solid";



                    var blw = parseFloat(blw);
                    var brw = parseFloat(brw);
                    var btw = parseFloat(btw);
                    var bbw = parseFloat(bbw);

                    //parseInt($(this).css("borderRightWidth"))
                    //console.log(parseInt($(this).css("borderLeftWidth")));

                    UpdateLock = true;


                    // Set width to 1px where 0px
                    if (anywidth == 0)
                        $(this).css('width', '1px');


                    if (borls && blw == 0.0 || (blw > 0.0 && blw < 1.0)) {
                        //console.log("setting border width");
                        $(this).css('border-left-width', '1px');
                    }

                    if (borrs && brw == 0.0 || (brw > 0.0 && brw < 1.0)) {
                        $(this).css('border-right-width', '1px');
                    }

                    if (borts && btw == 0.0 || (btw > 0.0 && btw < 1.0)) {
                        $(this).css('border-top-width', '1px');
                    }

                    if (borbs && bbw == 0.0 || (bbw > 0.0 && bbw < 1.0)) {
                        $(this).css('border-bottom-width', '1px');
                    }

                    UpdateLock = false;
                }
                catch (ex) {
                    UpdateLock = false;
                    //console.log(ex);
                }

            });             // End $('*').each

            // console.log("loop");




            var $img = $("img[onload^='this.fitproportional=true']");
            if ($img == null) {
                // console.log("img is null");
                return;
            }
            var $div = $img.parent();
            if ($div == null) {
                // console.log("div is null");
                return;
            }

            UpdateLock = true;
            {
                $img.removeAttr("height");
                $img.css('max-width', '100%')
                $img.css('max-height', '100%')

                $div.css('text-align', 'right');

                var divMinWidth = parseFloat($div.css('min-width'));
                var divWidth = parseFloat($div.css('width'));

                var divMinHeight = parseFloat($div.css('min-height'));
                var divHeight = parseFloat($div.css('height'));

                // console.log("width: " + divWidth);
                // console.log("height: " + divHeight);
                // console.log("min-width: " + divMinWidth);
                // console.log("min-height: " + divMinHeight);

                if (divMinWidth != 0)
                    $div.css('width', $div.css('min-width'));

                if (divMinHeight != 0)
                    $div.css('height', $div.css('min-height'));

            }
            UpdateLock = false;

        }


        $(document).ready(function() {

            switch (language) {
                case "fr":
                    iLanguageIndex = 1;
                    break;
                case "it":
                    iLanguageIndex = 2;
                    break;
                case "en":
                    iLanguageIndex = 3;
                    break;
                default: // "DE" 
                    iLanguageIndex = 0;
            }

            TranslateParameterPrompts();
            // setInterval(function() { TranslateParameterPrompts() }, 100);


            if ($.browser.msie && !bInFrameOrIframe)
                return;

            // if ($.browser.webkit)
            //setTableSize();

            $("[id$='ReportFrameReportViewerControl']").load(function() {
                //setNewHeight();
                //alert("Loading");

                setTableSize();

                $(
                    $("[id$='ReportFrameReportViewerControl']")[0].contentWindow.document
                )
                .find("[id$='report']").load(function() {
                    //alert("load report");
                    setTableSize();
                }
                ); // End load #report

            }); // End Function load #ReportFrameReportViewerControl

        });    // End Function document.ready

    </script>

</head>
<body style="margin: 0px; overflow: auto">
    <form style="width:100%;height:100%" runat="server" ID="ReportViewerForm">
        <RS:ReportViewerHost ID="ReportViewerControl" runat="server" />
    </form>
</body>
</html>

注意:UpdateLock源于2012年的backport并且在这里并没有真正使用,语言也来自backport,2012年需要在TranslateParameterPrompts上使用setInterval 和功能 对于2012年只有少量添加&#34;标签&#34;在jQuery选择器中......

    function TranslateParameterPrompts() {

        //mTo = false;
        $("table[id^='ParametersGridReportViewerControl'] label span").each(function(index) {
            var strText = $(this).text();
            if (strText != null && strText.indexOf('/') != -1) {
                strText = strText.split('/');
                if (iLanguageIndex < strText.length)
                    strText = strText[iLanguageIndex];
                else 
                { 
                    if(strText.length > 0)
                        strText = strText[0];
                }

                $(this).text(strText);
            }

        });

        //setTimeout(function(){mTo = true}, 5000);
    }

从浏览器语言中推断语言是这样的,顺便说一下:

<script type="text/javascript">
    language = <%= System.Web.HttpContext.Current.Request.UserLanguages != null ? "\"" + System.Convert.ToString(System.Web.HttpContext.Current.Request.UserLanguages[0]) + "\"" : "null" %>;

    if(language == null)
        language = window.navigator.userLanguage || window.navigator.language;

    if(language != null)
        language = language.substr(0,2).toLowerCase();

</script>

在2012年,你需要处理会话cookie,否则你得到&#34; HTTP 400:标题太长&#34;在打开约120份报告后:

<script type="text/C#" runat="server">
protected string ClearSessionKeepAliveCookiesToPreventHttp400HeaderTooLong()
{
    if(Request == null || Request.Cookies == null)
        return "";

    if(Request.Cookies.Count < 60)
        return "";

    // System.Web.HttpContext.Current.Response.Write("<h1>"+Request.Cookies.Count.ToString()+"</h1>");
    for(int i = 0; i < System.Web.HttpContext.Current.Request.Cookies.Count; ++i)
    {
        if(StringComparer.OrdinalIgnoreCase.Equals(Request.Cookies[i].Name, System.Web.Security.FormsAuthentication.FormsCookieName))
            continue;

        if(!Request.Cookies[i].Name.EndsWith("_SKA", System.StringComparison.OrdinalIgnoreCase))
            continue;

        if(i > 60)
            break;

        //System.Web.HttpContext.Current.Response.Write("<h1>"+Request.Cookies[i].Name+"</h1>");

        System.Web.HttpCookie c = new System.Web.HttpCookie( Request.Cookies[i].Name );
        //c.Expires = System.DateTime.Now.AddDays( -1 );
        c.Expires = new System.DateTime(1970, 1 ,1);
        c.Path = Request.ApplicationPath + "/Pages";
        c.Secure = false;
        c.HttpOnly = true;

        // http://stackoverflow.com/questions/5517273/httpcookiecollection-add-vs-httpcookiecollection-set-does-the-request-cookies
        //Response.Cookies[Request.Cookies[i].Name] = c;
        //Response.Cookies.Add(c);
        Response.Cookies.Set(c);
    }

    return "";
}


</script>

2012年,您需要收听内容更新,因为它使用Microsoft Ajax控件

function cbOnContentUpdate() {
    //console.log("content update");
    alterTableBorderWidth();
    // TranslateParameterPrompts();
} // End Callback cbOnContentUpdate


var hLastTimeout = null;

function queueUpdate() {

    if (UpdateLock)
        return;


    if (hLastTimeout != null)
        clearTimeout(hLastTimeout);

    hLastTimeout = window.setTimeout(function() { cbOnContentUpdate(); }, 50);

    //window.setTimeout(function() { cbOnContentUpdate(); }, 3000);
} // End Function queueUpdate


$(document).ready(function() {

    switch (language) {
        case "fr":
            iLanguageIndex = 1;
            break;
        case "it":
            iLanguageIndex = 2;
            break;
        case "en":
            iLanguageIndex = 3;
            break;
        default: // "DE" 
            iLanguageIndex = 0;
    }

    setInterval(function() { TranslateParameterPrompts() }, 100);

    // opt-out for non-framed IE, because that crook supports IE5-Quirks (framed takes parent-doctype in IE >= 9)
    if ($.browser.msie && !areWeInFrame())
        return;


    // if ($.browser.webkit)

    // console.log('Setting event listener!');

    // http://stackoverflow.com/questions/4979738/fire-jquery-event-on-div-change
    //$("[id$='ReportViewerControl']").bind('DOMNodeInserted DOMNodeRemoved', function(event) {
    //$("[id$='ReportArea']")
    $("body")
     .bind('DOMNodeInserted DOMNodeRemoved DOMSubtreeModified', function(event) {

         if (event.type == 'DOMNodeInserted') {
             //console.log('Content added! Current content:' + '\n\n' + this.innerHTML);
             //console.log('Content added!');
             queueUpdate();
         }
         else {
             //console.log('Content removed! Current content:' + '\n\n' + this.innerHTML);
             //console.log('Content removed!');
             queueUpdate();
         }
     }); // End Bind IRM

});   // End Function $(document).ready

请注意,对于2012年,setTableSize是alterTableBorderWidth,选择器是这样的:

 function alterTableBorderWidth() 
        {
            //$('*')
            $("[id$='ReportViewerControl']").find('*')
            .each(function() {

顺便说一下,如果你想删除PRINT图标,因为它只是一个悲伤的源头,就像这样(德语,英语,法语和意大利语[瑞士语+英语])。

此CSS适用于2008年的R1,如果在2012年相同,则不知道和关心。

input[type="image"][title="Drucken"], input[type="image"][title="Print"], input[type="image"][title="Imprimer"], input[type="image"][title="Stampa"]
{
    display: none !important;
}

如果仍然没有阻止你,那么请继续使用SSRS 2012中的表单身份验证(提示1:2005-2008R2没有ms提供的样本,你需要自己编写) ;)

提示2:如果您跟着hint1,表单身份验证重定向在URL [冒号?]中有冒号时不起作用,您可以从单声道窃取代码并编写自己的重定向。

提示3:如果您按照hint2进行表单身份验证工作,那么您可能想要更改您要编写的上传工具,因为您不想手动执行&#34;报告browse-directory - 检查允许覆盖复选框 - 上传报告 - 设置数据源)120个报告左右,然后您将从ReportingService2005继承一个类并覆盖GetWebRequest和GetWebResponse

''' <summary>
''' Overriding the method defined in the base class.
''' </summary>
''' <param name="uri"></param>
''' <returns></returns>
Protected Overrides Function GetWebRequest(uri As Uri) As System.Net.WebRequest
    Dim request As System.Net.HttpWebRequest
    request = DirectCast(System.Net.HttpWebRequest.Create(uri), System.Net.HttpWebRequest)
    request.Credentials = MyBase.Credentials
    request.CookieContainer = New System.Net.CookieContainer()

    If m_authCookie IsNot Nothing Then
        request.CookieContainer.Add(m_authCookie)
    End If

    Return request
End Function ' GetWebRequest 



''' <summary>
''' Overriding the method defined in the base class.
''' </summary>
''' <param name="request"></param>
''' <returns></returns>
Protected Overrides Function GetWebResponse(request As System.Net.WebRequest) As System.Net.WebResponse
    Dim response As System.Net.WebResponse = MyBase.GetWebResponse(request)

    ' http://social.msdn.microsoft.com/Forums/sqlserver/en-US/f68c3f2f-c498-4566-8ba4-ffd5070b8f7f/problem-with-ssrs-forms-authentication
    Dim cookieName As String = response.Headers("RSAuthenticationHeader")
    If cookieName IsNot Nothing Then
        m_authCookieName = cookieName
        Dim webResponse As System.Net.HttpWebResponse = DirectCast(response, System.Net.HttpWebResponse)
        Dim authCookie As System.Net.Cookie = webResponse.Cookies(cookieName)

        ' Save it for future reference and use.
        m_authCookie = authCookie
    End If

    Return response
End Function ' GetWebResponse 

提示4:如果您未在SSRS 2008 R2上安装Service Pack 1 + 2,上述方法将无法运行...

提示5:TranslateParameters方法就在那里,因为你不能(通过设计)通过SSRS将参数提示转换为多种语言,所以你写道:

Raum / Local / Locale / Room 

使用架构:

Text_DE / Text_FR / Text_IT / Text_EN

然后按&#39; /&#39;拆分在文本上(如果您的提示文本包含&#39; /&#39;某处),则会有一点点容易出错,然后通过选择MIN(splitarray.length,index)btw,按语言索引选择正确的文本,以防万一你只有Text_DE / Text_FR或其他什么,首先检查文本是否包含&#39; /&#39;当然,还有。

提示6: 需要我继续吗? (我仍然可以将这篇文章扩大到10倍,但我想我现在应该回去工作:))

如果你想看看它的外观是多少,这就是vanilla ssrs在chrome中呈现的方式

Vanilla SSRS chrome

这是IE11中的样子,通过xua设置IE5兼容性

Geb

这就是它应该是什么,以及你可以通过javascript和CSS进行大量修改来渲染它 SSRS in Chrome with CSS and JS applied

<强>附录:
哦,它变得更好

如果要以应用程序指定的语言(与浏览器语言不同)运行reportviewer,则需要将reportviewer的文化设置为查询字符串中指定的区域性...

<script type="text/C#" runat="server">
    protected override void InitializeCulture()
    {
        string sprache = System.Web.HttpContext.Current.Request.QueryString["in_sprache"];

        // System.Web.HttpContext.Current.Response.Write(sprache);

        switch(System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToLower(sprache))
        {
            case "fr":
                sprache = "fr-CH";
                break;
            case "it":
                sprache = "it-CH";
                break;
            case "en":
                sprache = "en-US";
                break;
            default:
                sprache = "de-CH";
                break;
        }

        // System.Web.HttpContext.Current.Response.Write(sprache);

        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(sprache);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(sprache);
        base.InitializeCulture();
    }



</script>

如果要设置静态区域性,可以在页面声明中执行此操作

<%@ Page UICulture="de" Culture="de-CH" %>

如果您尝试删除打印图标和原子输入,无论如何都可以使用样式,它只适用于Chrome ...

    input[type="image"][title="Drucken"], input[type="image"][title="Print"],    input[type="image"][title="Imprimer"], input[type="image"][title="Stampa"]
    {
        display: none !important;
    }


    input[type="image"][title="In Datenfeed exportieren"], input[type="image"][title="Exporter vers un flux de données"], input[type="image"][title="Esporta in feed di dati"], input[type="image"][title="Export to Data Feed"]
    {
        display: none !important;
    }
    */
    input[type="image"][src$="Microsoft.Reporting.WebForms.Icons.Print.gif"] {
        display: none !important;
    }

    input[type="image"][src$="Microsoft.Reporting.WebForms.Icons.AtomDataFeed.gif"] {
        display: none !important;
    }

但您可以通过将ShowPrintButton="false"添加到reportviewer控件来实际删除Internet-explorer中的至少打印图标:

<RS:ReportViewerHost ID="ReportViewerControl" ShowPrintButton="false" runat="server" />

另一个想法:在SSRS 2012&amp; 2014(可能还有2008R2),您还可以将修复SSRS的javaScript方法添加到ScriptManager的add_pageLoaded中。像这样:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function () { fixReportingServices('rpt-container'); });

然后你不必听取页面更改事件,这会加快速度,因为加载只会在每次更新结束时调用一次。

警告

因为在互联网上,IE并不默认为兼容性视图,

<meta http-equiv="X-UA-Compatible" content="IE=5">

也不会帮助您处理某些问题(rotate270文字/垂直文字)。

即使在IE中,它只能在您进入Intranet时才能正常工作,因为只有这样才能使用&#34;兼容性视图&#34;。虽然元标记将浏览器设置为IE5-Quirksmode,但它并没有启用&#34;兼容性视图&#34;,因此它不是真正的怪癖模式......

答案 1 :(得分:3)

MS Report Viewer Control仅在IE中正常工作。 您可以查看其他浏览器的报告,但无法查看缩放选项

答案 2 :(得分:1)

有关浏览器可用性和ReportViewer控件的信息,请参阅以下MSDN文章:

答案 3 :(得分:0)

我没有注意到它在Firefox或Safari中显示有任何实际问题。有时我认为它可能会在Firefox中呈现得更好,但我没有任何实际的基准来支持它。

答案 4 :(得分:0)

从臀部开始,或许有点陈旧。 ASP.NET曾经将任何非IE浏览器视为一块石头。如果您的经历出现问题,可能值得一试。

http://weblogs.asp.net/fmarguerie/archive/2005/01/04/346222.aspx

答案 5 :(得分:0)

SSRS在IE6,7,8上完美运行。它适用于Firefox和Safari,但显示问题。

有两种可能的解决方案可以解决这些问题,测试并查看适合您的方法。

解决方案1 ​​

转到

  

C:\ Program Files \ Microsoft SQL   Server \ MSSQL。(您的报表服务器   实例)\报告   服务\的ReportServer \页面\ reportviewer.aspx

将样式更新为

<body style="margin: 0px; overflow: auto"> ... <RS:ReportViewerHost style="display:table;" ID="ReportViewerControl" runat="server" />

解决方案2

在样式表中添加以下更改:

  

.DocMapAndReportFrame {min-height:660px;最小宽度:1280px; }   .MenuBarBkGnd {min-width:1000px; }

答案 6 :(得分:0)

Firefox,Chrome和Safari存在渲染问题。我知道对于Firefox和Chrome,有一些IE加载项允许您在Firefox / Chrome标签页中运行报告。