Как использовать ReportViewer 2010 в MVC.NET 2 - PullRequest
5 голосов
/ 26 августа 2010

В основном я хочу знать, как встроить отчет в MVC.Net 2.

1 Ответ

8 голосов
/ 26 августа 2010

Я задал вопрос, потому что в Интернете недостаточно информации или информация не полная, поэтому вы можете начать работать.

Первое, что вам нужно знать, это то, что средство просмотра отчетов является веб-элементом управления, поэтому вы не можете использовать его в MVC, поэтому первое, что вам нужно сделать, - это создать веб-форму, чтобы вы могли добавить средство просмотра отчетов. В примере, который я сделал, я использую Visual Studio 2010.

Веб-форма выглядит так:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Report Viewer</title>
</head>
<body>
    <div style="width: auto;">
        <form id="form1" runat="server" style="width: 100%; height: 100%;">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <rsweb:ReportViewer ID="rptViewer" runat="server" Width="100%" Height="100%" AsyncRendering="False"
            SizeToReportContent="True">
        </rsweb:ReportViewer>
        </form>
    </div>
</body>
</html>

Код веб-формы:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var reportServer = ConfigurationManager.AppSettings["ReportServer"].ToString();
        var reportPath = ConfigurationManager.AppSettings["ReportPath"].ToString();

        rptViewer.ServerReport.ReportServerUrl = new Uri(reportServer);
        rptViewer.ShowToolBar = false;
        rptViewer.ServerReport.ReportPath = reportPath + Request.QueryString["ReportName"];
        List<ReportParameter> parameters = new List<ReportParameter>();
        string[] keys = Request.QueryString.AllKeys;
        for (int i = 1; i < Request.QueryString.Count; i++)
        {
            parameters.Add(new ReportParameter(keys[i], Request.QueryString[i]));
        }
        this.ReportViewer1.ServerReport.SetParameters(parameters);
        this.ReportViewer1.ProcessingMode = ProcessingMode.Remote;
        this.ReportViewer1.ShowParameterPrompts = false;
        this.ReportViewer1.ShowPromptAreaButton = false;
        this.ReportViewer1.ServerReport.Refresh();

        rptViewer.ProcessingMode = ProcessingMode.Remote;
        rptViewer.ServerReport.Refresh();
    }
}

Теперь нам нужно использовать MVC. У нас есть два варианта: открыть новое окно с всплывающим javascript или использовать iframe.

Я сделаю и то, и другое, чтобы у вас была лучшая идея в представлении:

<iframe id="Frame1" src="<%= Session["Url"] %>" width="230" height="230" frameborder="0"></iframe> **1
 function OpenReports(name) {
            var width = (screen.availWidth - 700).toString();
            var height = (screen.availHeight - 100).toString();
            window.open('/Reporting/Reports.aspx?ReportName=' + name,
                 'mywindow', 'width=' + width + ',height=' + height + ',toolbar=no,location=no,directories=yes,status=no,' +
                'menubar=no,scrollbars=yes,copyhistory=yes,resizable=yes' + ',screenX=0,screenY=0,left=0,top=0');

        } **2

** 1 SessionURL - это переменная сеанса с путем и отчетом, который мы хотим показать. Также это первый способ встроить отчет с помощью iframe

.

** 2 /Reporting/Reports.aspx - это путь веб-формы, которую мы только что сделали более простой. Это второй способ, открытие нового окна.

В контроллере:

 public ActionResult ViewName()
 {
    Session["Url"] = "/Reporting/Reports.aspx?ReportName=Report44";
    return View();
 }**1

** 1 /Reporting/Reports.aspx - это путь веб-формы, которую мы только что сделали более простой.

Также Если вы используете Report Viewer 10, запомните эту функцию в web.config:

<system.web>
    <httpHandlers>
      <add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </httpHandlers>
</system.web>

Надеюсь, что все это руководство кому-нибудь поможет:)

...