【问题标题】:ReportViewer control not displaying reportsReportViewer 控件不显示报告
【发布时间】:2013-07-10 15:53:38
【问题描述】:

我几乎到处都在寻找解决此问题的方法,但还没有找到对我有用的方法。我在我们的托管服务器上设置了一个报告服务器(2008 R2)。我使用报表生成器从头开始创建了一个报表,并在使用其 URL 登录报表服务器时对其进行了测试,并成功生成了报表。

当我尝试从我们的 MVC 应用程序查看报告时,只有报告工具栏呈现(显示导出、打印、页面和查看报告按钮)。它显示它正在“加载”,完成后它只是一个空白报告,但它在工具栏上显示了正确的参数,如果我在代码中更改参数的名称,它会返回一个错误,说明参数没有存在;所以我知道地址用户/密码信息是正确的。

页面的代码和标记

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="Comp.Proj.Core.Model"%>
<%@ Import Namespace="Comp.Proj.Core.Service" %>
<%@ Import Namespace="Microsoft.Reporting.WebForms" %>
<%@ Import Namespace="System.Security.Principal" %>
<%@ Import Namespace="System.Net" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

  <h2><a href="/Reporting">Back to Reports</a> / <%=ViewData["Report"]%></h2>
    <form action="/Reporting/DateViewer" method="get">
      Start Date:
      <input type="text" name="start" class="datepicker" value="<%=ViewData[" Start "] %>" /> End Date:
      <input type="text" name="end" class="datepicker" value="<%=ViewData[" End "] %>" />
      <input type="hidden" name="id" value="<%=ViewData[" Report "] %>" />
      <input type="submit" class="button" value="Run" />
    </form>

    <script runat="server" language="C#">
      protected void Page_Load(object sender, EventArgs e) {
        try {
          if (!IsPostBack) {
            if (ViewData["Start"] != null) {
              var param = new List < ReportParameter > ();


              var start = new ReportParameter("start", ViewData["Start"].ToString());
              var end = new ReportParameter("end", ViewData["End"].ToString());
              var region = new ReportParameter("region", "2");
              param.Add(start);
              param.Add(end);
              param.Add(region);
              ReportViewer1.Width = 1100;
              ReportViewer1.Height = 900;
              ReportViewer1.ShowCredentialPrompts = false;
              ReportViewer1.ShowDocumentMapButton = false;
              ReportViewer1.ShowExportControls = true;
              ReportViewer1.ShowFindControls = false;
              ReportViewer1.ShowPrintButton = true;
              ReportViewer1.ShowPromptAreaButton = false;
              ReportViewer1.ShowRefreshButton = false;
              ReportViewer1.ShowToolBar = true;
              ReportViewer1.ShowZoomControl = false;
              ReportViewer1.SizeToReportContent = true;
              ReportViewer1.ProcessingMode = ProcessingMode.Remote;
              IReportServerCredentials irsc =
                new CustomReportCredentials(ConfigurationManager.AppSettings["ReportServerUser"],
                                            ConfigurationManager.AppSettings["ReportServerPassword"], "SERVERNAME");
              ReportViewer1.ServerReport.ReportServerCredentials = irsc;
              ReportViewer1.ServerReport.ReportServerUrl =
                new Uri(string.Format("http://{0}/ReportServer",
                                      ConfigurationManager.AppSettings["ReportServerUrl"]));
              ReportViewer1.ServerReport.ReportPath = string.Format("/{0}", ViewData["Report"]);
              ReportViewer1.ServerReport.SetParameters(param);
              ReportViewer1.ShowReportBody = true;
              ReportViewer1.ServerReport.Refresh();
            }
          }
        } catch (Exception ex) {
          Response.Write(ex.Message);
        }
      }
    </script>

    <form id="form1" runat="server">
      <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
      <div>
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" />
      </div>
    </form>

</asp:Content>

网络配置

<assemblies>
    <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>

<buildProviders>
    <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</buildProviders>

<system.webServer>
    <handlers>
        <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
</system.webServer>

【问题讨论】:

  • 我可能遗漏了一些东西,但是您在哪里将数据源应用到您的报告中?
  • 没关系您正在使用报告服务
  • 更新了线程,我省略了 web.config 的 buildProviders 部分。

标签: c# asp.net-mvc reporting-services web-config reportviewer2008


【解决方案1】:

我终于让它工作了。对于那些和我有同样问题的人,我就是这样做的。

在页面指令中,设置EnableEventValidation="false" 并为报表控件设置AsyncRendering="false"

【讨论】:

  • 这对我不起作用。有人可以提出任何其他解决方案。谢谢
  • 这是我升级旧解决方案时的修复方法。报告在某些页面上有效,但在其他页面上无效。在网上搜索之后,AsyncRendering="false" 是它的工作原理。谢谢!
【解决方案2】:

我从不添加这些解决方案,但我觉得是时候“回馈”而不是仅仅“获取”了。

当我的页面在页面加载时出现以下内容时,报表查看器会显示参数,但不会显示实际报表。请注意我有 AysncRendering=false。 所以这段代码不起作用(VB)。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim UserName = HttpContext.Current.User.Identity.Name
    Dim paramList As New Generic.List(Of ReportParameter)
    paramList.Add(New ReportParameter("UserID", UserName, False))
    ReportViewer1.ServerReport.SetParameters(paramList)
End Sub

但是当我添加以下行时,没有其他更改,整个报告就加载了。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim UserName = HttpContext.Current.User.Identity.Name
    If IsPostBack = False Then
        ReportViewer1.Width = 900
        ReportViewer1.Height = 900

        Dim paramList As New Generic.List(Of ReportParameter)
        paramList.Add(New ReportParameter("UserID", UserName, False))
        ReportViewer1.ServerReport.SetParameters(paramList)
        ReportViewer1.ShowReportBody = True
        ReportViewer1.ServerReport.Refresh()
    End If

请注意,我没有像之前的帖子在这里提到的那样对页面声明进行任何更改。

【讨论】:

    【解决方案3】:

    我所做的是确保页面的所有 web.config 都使用参考 ReportViewer 10。 奇怪的是,屏幕仍然显示空白页。单击刷新,它出现了。这可能是由于会话。

    【讨论】:

      【解决方案4】:

      下面的代码对我有用

      我正在使用报告服务 14 并在后面的代码中设置 ReportViewer1.ServerReport.ReportServerUrl 和 ReportViewer1.ServerReport.ReportPath。

      Report1.aspx

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report1.aspx.cs" Inherits="CIEM.Web.Reports.Report1" %>
      <%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %>
      
      <!DOCTYPE html>
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head runat="server">
      <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
      <title></title>
          <style>
          html,body,form,#div1 {
              height: 100%; 
          }
      </style>
      </head>
      <body>
      <form id="form1" runat="server">
      <div id="div1" >
              <asp:ScriptManager runat="server"></asp:ScriptManager>
          <rsweb:ReportViewer ID="ReportViewer1" runat="server" ProcessingMode="Remote" Height="100%" Width="100%">
          </rsweb:ReportViewer>
      </div>
      </form>
      </body>
      

      https://docs.microsoft.com/en-us/sql/reporting-services/application-integration/integrating-reporting-services-using-reportviewer-controls-get-started?view=sql-server-2017#set-the-height-of-all-the-ancestors-to-100

      【讨论】:

        【解决方案5】:

        https://msdn.microsoft.com/en-us/library/ms252090.aspx

        1.将 ReportViewer 控件上的高度显式设置为实际值而不是百分比。
        2.在标签中添加如下样式设置:html,body,form {height:100%}。通过强制 HTML, body 和 form 标签到最大高度,框架中使用 ReportViewer 控件也将增长到最大高度,使其 在页面上可见。
        3.从页面中删除xhtml doctype。 (重要)

        【讨论】: