Совместимость браузера SSRS Reporter

Насколько совместим MS Project Viewer с браузерами, такими как Firefox и Safari?

Также сообщайте, если вы знакомы со сторонними докладчиками отчетов для SSRS.

Ответ 1

Изменить - 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 < 2016). Вам нужно установить context.Request.UserLanguages[i] на язык, указанный в строке запроса в контексте .BeginRequest в HTTP-модуле, если вы хотите, чтобы datepicker работал с не-браузерным языком.

Кроме того, вам нужно добавить HTTP-заголовки X-Frame-Options и Content-Security-Policy в каждом HTTP-ответе, если вы хотите безопасно использовать SSRS в iframe в Интернете. Подробнее см. мой github-репозиторий.

</EndEdit>

Pre-2016:

Я могу вам сказать, у меня 9-летний опыт работы с этой чертовой штукой (SSRS 2005, SSRS 2008 R1 и R2, 2012 и SSRS 2014).

Позвольте мне заверить вас, что, поскольку отчеты SSRS HTML зависят от IE5-Quirksmode, нет никаких шансов, что они когда-либо будут корректно отображаться в любом браузере, отличном от Internet Explorer (IE < 10 Я мог бы склоняться к добавлению).

ЕСЛИ у вас есть доступ администратора к серверу отчетов, и я подчеркиваю IF, вы можете добавить подпрограммы jQuery и CSS на странице ReportViewer, чтобы исправить самые основные проблемы (например, вы не видите более 1 см отчета), но в противном случае рендеринг HTML по-прежнему будет выглядеть абсолютно ужасно (поля, границы таблицы, прокрутки изображения, размер столбца, размер текстового поля, название и/или выравнивание pagenumber и т.д., короче - почти что-либо)

Конечно, элемент управления ActiveX может работать только в InternetExplorer (в Windows), потому что поддерживается только ActiveX.

Позвольте мне также заверить вас, что в аду нет абсолютно никакого способа заставить ReportManager работать в любом другом браузере, чем IE.

Что касается поддержки Internet Explorer, следует упомянуть, что начиная с IE версии 10 IE по умолчанию использует webkit-quirksmode (по соображениям совместимости) вместо IE5 quirksmode, поэтому HTML-рендеринг будет выглядеть одинаково ужасно, как в Chrome/Firefox/Safari для IE 10+, если вы не добавили мета-xua-совместимый IE5 на странице ReportViewer.aspx.

Последний может не применяться к Intranet, так как IE автоматически возвращается в режим совместимости IE 7, когда он находится на узле интрасети (но только в любой версии Windows < 8).

В Windows 8 ссылки localhost и ссылки на имя пользователя (не могут добавлять сообщения http://в сообщениях stackoverflow) не назначаются локальной зоне интрасети (возможно, это быстрый хак, поэтому IE не возвращается в режим совместимости IE7), и поэтому проверка подлинности Windows будет FAIL.

Следует также отметить, что невозможно добавить мета-совместимый IE5 для ReportManager, потому что нет страницы, которую вы можете редактировать (скомпилированный не обновляемый веб-проект ASP.NET...).

И если не использовать dev-tools для переключения Reportmanager в quirksmode, невозможно использовать ReportManager в IE 10 +.

Затем следует упомянуть еще одно: начиная с IE9 IE наследует doctype элементов iframe с родительской страницы, и нет никакого способа в аду изменить это (без изменения родительской страницы на желаемый дочерний -страничный doc-режим).

Итак, если вы были достаточно умны, чтобы использовать iframes для отчетов, потому что нет никакого способа в аду любой здравомыслящий человек хочет всплывающих окон в возрасте всплывающих блокировщиков, страница отчета наследует родительскую страницу doctype. Если это не IE5-QuirksMode, он сделает отчеты одинаково ужасными, как в Safari/Chrome/Firefox/Opera для любого IE > 8, независимо от любого возможного мета-xua-совместимого тега ie5 в ReportViewer.aspx.

Что касается альтернатив, то для бесплатного и с аналогичным набором функций существует только Eclipse BIRT (к счастью, HTML-рендеринг не похож)

Следует отметить, что BIRT, хотя и лицензируется в рамках публичной лицензии Eclipse, использует SUN Java, и поэтому вы используете технологию Oracle, которая подчиняется соответствующим условиям лицензирования.
Кроме того, вы используете технологию, отличную от Microsoft, а визуализаторы Excel-Sheets BIRT на самом деле представляют собой XML файлы, которые будут выдавать (кто бы предположил) довольно тревожное предупреждение при открытии в Office 2010 +.

Затем для довольно большой платы есть http://www.stimulsoft.com отчеты, и Telerik сообщает.
Из технических взглядов я бы рекомендовал отчеты stimulsoft, но: отказ от ответственности, я не использовал ни одного из них, потому что они не являются бесплатными.

Что касается альтернативных движков рендеринга SSRS (но не для зрителей), существует только www.fyireporting.com/, у которого есть вилка здесь http://www.codeproject.com/Articles/138271/An-Open-Source-RDL-Engine.

Но fyiReporting является неполным и работает в процессе (если не оставлен), поэтому я бы воздержался от его использования.





Итог, если ваш продукт - только IE и окна, с версией Windows < 8 (и no - not <= на всякий случай, если вы не обращали внимания), в интрасети, вызванной из всплывающих окон, а не iframe, затем перейдите к SSRS. Для чего-либо еще используйте отчеты stimulsoft (проблема в том, что вы должны переделать все свои отчеты, так как автоматическая миграция отсутствует, даже не работающая).

PS:
И добавив "немного javascript", я имею в виду следующую вещь (2008 R1 Edition, не будет работать в 2008R2 +, может работать в 2005 году, и обратите внимание, что вам нужно встроить jQuery и jQuery Migrate в тег inline- script, если клиентский компьютер не имеет доступа к http (s)://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 проистекает из backport 2012 года и на самом деле не используется здесь, а язык также вытекает из backport, setInterval на TranslateParameterPrompts необходим в 2012 году и функция на 2012 год есть только небольшое дополнение "метки" в селекторе 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);
    }

Вывод языка из языка браузера происходит следующим образом: btw:

<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 сеанса, иначе вы получите "HTTP 400: слишком длинный заголовок" после открытия около 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() {

Btw, если вы хотите удалить пиктограмму 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: нет образца с ms-provied, как для 2005-2008R2, вам нужно написать его самостоятельно);)

Hint2: если вы следовали за hint1, переадресация проверки подлинности форм не работает, если у вас есть двоеточие в URL [ошибка?], вы можете украсть код из моно и написать свою собственную переадресацию.

Hint3: если вы следовали за hint2 и получили работу с проверкой подлинности форм, то вы, вероятно, захотите изменить инструмент загрузки, который собираетесь писать, потому что вам не понравится делать вручную "для каждого каталога просмотра отчетов". override checkbox - upload report - set datasource) для 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. Вышеуказанные методы не будут работать, если вы не установили пакет обновления 1 + 2 в SSRS 2008 R2...

Подсказка 5: Метод TranslateParameters существует, потому что вы не можете (по дизайну) переводить подсказки параметров на несколько языков по SSRS, поэтому вы пишете:

Raum / Local / Locale / Room 

который использует схему:

Text_DE / Text_FR / Text_IT / Text_EN

И затем разделите на текст "/" на текст (это небольшая ошибка, если текст приглашения содержит "/" где-то), а затем выберите правильный текст по индексу языка, выбрав MIN (splitarray. длина, индекс) btw, на всякий случай, где-то у вас есть только Text_DE/Text_FR или что-то еще, сначала проверяя, содержит ли текст//вообще.

Подсказка 6: Нужно ли продолжать? (я все еще могу расширить этот пост до десятикратного размера, но я думаю, что я должен вернуться к работе сейчас:))

Если вы хотите увидеть, как выглядит f * вверх, так это то, как vanilla ssrs отображается в chrome

Vanilla SSRS chrome

Это то, что похоже на IE11, с совместимостью IE5, установленной через xua

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

Но вы действительно можете удалить хотя бы значок печати в Internet Explorer, добавив ShowPrintButton="false" в элемент управления reportviewer:

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

Другая идея: в SSRS 2012 и 2014 (и, возможно, 2008R2) вы также можете добавить свой javascript-метод SSRS-fixing в add_pageLoaded из ScriptManager. Вот так:

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

Тогда вам не нужно слушать события изменения страницы, что ускоряет работу, потому что загружается только один раз в конце каждого обновления.

ВНИМАНИЕ!

Потому что в Интернете IE не имеет разрешения на совместимость,

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

также не поможет вам с определенными проблемами (rotate270 text/vertical text).

Даже в IE он работает только правильно, когда вы находитесь в интрасети, потому что только тогда он использует "представление совместимости". В то время как мета-тег устанавливает brower в IE5-Quirksmode, он не включает "представление совместимости", поэтому это не истинный quirksmode...

Ответ 2

MS Report Viewer Control будет работать нормально только в IE. Вы можете просмотреть отчеты из других браузеров, но вы не сможете просмотреть параметр масштабирования

Ответ 4

Я не заметил никакой реальной проблемы с его отображением в Firefox или Safari. Время от времени я думаю, что это может быть улучшено в Firefox, но у меня нет реальных ориентиров, чтобы поддержать это.

Ответ 5

От бедра и, возможно, немного затхлый. ASP.NET используется для обработки любого браузера, не являющегося браузером IE, как коробка скал. Может быть стоит посмотреть, если ваши проблемы с опытом.

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

Ответ 6

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; мин-ширина: 1280 пикселей; }
.MenuBarBkGnd {min-width: 1000px; }

Ответ 7

Проблемы с рендерингом существуют с Firefox, Chrome и Safari. Я знаю, что для Firefox и Chrome есть надстройки IE, которые позволяют запускать отчет на вкладке Firefox/Chrome.