SSRS ReportViewer 2010 Iframe IE проблема - PullRequest
2 голосов
/ 24 мая 2010

Моя проблема связана с попыткой включить отчет SSRS (SQL Server) в мое приложение MVC.

Я остановился на гибридном решении, состоящем в том, чтобы использовать WebForm с элементом управления ReportViewer, а затем на страницах моего MVC View, в которых iframe ссылаются на эту страницу WebForm.Сложность в том, что iframe нужно динамически заполнять отчетом, а не использовать src из-за публикации параметров в WebForm.

Он отлично работает в Firefox и Chrome, однако IE выдает «Sys is Undefined»ошибка javascript.

Использование src в iframe работает в IE, но я не могу найти способ публикации параметров (не хочу использовать что-то вроде /Report.aspx?param1=test из-за возможногодлина).

Это проект ASP.NET MVC 2, .NET 4, Visual Studio 2010 в Windows 7 x74, если это поможет.

Так вот код (я мог бы предоставитьФайлы проекта VS2010, если они кому-то нужны)

В моей веб-форме:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="SSRSMVC.Views.Home.Report" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <form id="RSForm" runat="server">

    <asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" ScriptMode="Release">
    </asp:ScriptManager>

    <asp:UpdatePanel ID="ReportViewerUP" runat="server">
        <ContentTemplate>
            <rsweb:ReportViewer ID="ReportViewer" runat="server" Width="100%" Height="380px" ProcessingMode="Local"
             InteractivityPostBackMode="AlwaysAsynchronous" AsyncRendering="true">
                <LocalReport ReportPath="Models\\TestReport.rdlc">

                </LocalReport>
            </rsweb:ReportViewer>
        </ContentTemplate>
    </asp:UpdatePanel>

    </form>
</body>
</html>

И Codebehind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Reporting.WebForms;

namespace SSRSMVC.Views.Home
{
    public partial class Report : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                string test = Request.Params["val1"];

                ReportViewer.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", new SSRSMVC.Models.DataProvider().GetData()));
            }
        }
    }
}

И, наконец, моя страница просмотра,

<script type="text/javascript">
    $(window).load(function () {
        $.post('/Report.aspx', { val1: "Hello World" }, function (data) {
            var rv_frame = document.getElementById('Frame1');
            rv_frame = (rv_frame.contentWindow) ? rv_frame.contentWindow : (rv_frame.contentDocument.document) ? rv_frame.contentDocument.document : rv_frame.contentDocument;

            rv_frame.document.open();
            rv_frame.document.write(data);
            rv_frame.document.close();
        });
    });
</script>

1 Ответ

3 голосов
/ 25 мая 2010

Решением является использование элемента формы для публикации и последующего заполнения iframe. Я также опубликовал ошибку Microsoft Connect, поскольку любой Microsoft AJAX внутри iframe вызывает ошибку JavaScript «sys is undefined», я пытался 1 Диспетчер скриптов и 1 панель обновлений и получили ту же ошибку.

Код обхода,

<div id="HiddenFormTarget" style="display:none;"></div>

<iframe frameborder="0" id="Frame1" name="Frame1" style="width: 100%;height: 400px; overflow: hidden;">
</iframe>

<script type="text/javascript">
    function ProcessReport() {
        var form = $('<form method="post" target="Frame1" action="/Report.aspx"></form>');
        form.append('<input type="hidden" id="val1" name="val1" value="Hello World!!!" />');

        $("#HiddenFormTarget").append(form);

        form.submit();

        $("#HiddenFormTarget").empty();
    }

    $(window).load(function () {
        ProcessReport();
    });

    $("H2").click(function () { ProcessReport(); });
</script>

http://connect.microsoft.com/VisualStudio/feedback/details/561066/reportviewer-2010-iframe-internet-explorer

...