如何在ASP.Net MVC中将RDLC报告与ReportViewer Control一起使用?

Nub*_*cus 5 c# asp.net-mvc rdlc reporting-services asp.net-mvc-4

我是ASP.Net MVC的新手.我要求在MVC中显示基于RDLC的报告.

基本上我的要求以及我所做的是: -

我有一个继承APIController的ReportController,它有一个返回DataSet的方法.此DataSet正被发送到RDLC文件.

为此,我已完成以下操作,但无法使报告生效.

我创建了一个名为ReportParameter的模型类,如下所示:

public class ReportParameter 
{
    public DateTime DateFrom { get; set; }
    public DateTime DateTo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有以下控制器ReportViewController:

public class ReportViewController : Controller
{
    static readonly ReportController ctrl = new ReportController();

    public ActionResult GenerateReport()
    {
        return View();
    }

    [HttpPost]
    public ActionResult GenerateReport(ReportParameterSalesOrder param)
    {
        if (ModelState.IsValid)
        {
            Helpers.DataLayer dl = new Helpers.DataLayer();
            if (param.DateFrom != null)
            {
                DateTime DateFrom = Convert.ToDateTime(param.DateFrom);
                DateTime DateTo = Convert.ToDateTime(param.DateTo);

                string fdate = DateFrom.ToString("yyyy/MM/dd");
                string tdate = DateTo.ToString("yyyy/MM/dd");

                Session["ReportSales"] = ctrl.ReportSales(param);
            }

            return Redirect(Url.Action("ViewReport", "ReportView"));
        }
        return View();
    }
    public ActionResult ViewReport()
    {
         return View();
    }

}
Run Code Online (Sandbox Code Playgroud)

我有一个API Controller ReportController,其对象已在上面的ReportViewerController中创建,以生成DataSet并填充RDLC报告.API控制器是:

public class ReportController : ApiController
{

    static readonly IReportRepository repository = new ReportRepository();

    [ActionName("ReportSales")]
    public DataSet ReportSales(ReportParameterSalesOrder paramSO)
    {
        DataSet item = repository.ReportSales(paramSO);
        if (item == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个视图GenerateReport.aspx和ViewReport.aspx.GenerateReport.aspx如下:

<table style="width: 40%;">
              <tr>
                  <td class="style1">
                      <h3>
                          <asp:Label ID="Label1" runat="server" Text="From Date"></asp:Label></h3>
                  </td>
                  <td>
                      <%=@Html.EditorFor(a=> a.DateFrom, new{id="startDate",style="width:250px;"}) %>
                      <%=@Html.ValidationMessageFor(a => a.DateFrom)%>
                  </td>
              </tr>
              <tr>
                  <td class="style1">
                      <h3>
                          <asp:Label ID="Label2" runat="server" Text="To Date"></asp:Label></h3>
                  </td>
                  <td>
                      <%=@Html.EditorFor(a => a.DateTo, new { id = "ToDate", style = "width: 250px;" })%>
                      <%=@Html.ValidationMessageFor(a => a.DateTo)%>
                  </td>
              </tr>
              <tr>
                  <td class="style1">
                      &nbsp;
                  </td>
                  <td>
                      &nbsp;
                  </td>
              </tr>
              <tr>
                  <td class="style1">
                      &nbsp;
                  </td>
                  <td>
                      <input id="btnsearch" class="button" type="submit" value="Show" />
                  </td>
              </tr>
          </table>
Run Code Online (Sandbox Code Playgroud)

ViewReport.aspx如下:

 <center style="width: 974px">
      <iframe id="myReport" width="100%" height="450px" src="ReportViewer.aspx">

        </iframe></center>
Run Code Online (Sandbox Code Playgroud)

我添加了一个Dataset.xsd,一个rdlc文件和一个aspx页面来添加rdlc文件.

但我不能让它发挥作用.如何显示报告,或如何将从Controller收到的数据集填充到报告中?

Stu*_*tLC 5

背景
(我知道你知道这一点,但对于未来的读者;-)

  • Microsoft ReportViewer控件需要ViewState和WebForms ScriptManagers才能正常工作,因此不适合直接在MVC视图中使用.
  • 但是,可以在MVC项目中运行WebForms页面 - 因为它们在相同的AppDomain中运行,Session状态在MVC和WebForms之间共享.

详细信息用于在MVC视图中呈现ReportViewer控件
ViewReport.aspx页面iframe需要是一个很好的老式asp.Net Web表单.

对于小型数据集,您可以在MVC控制器中获取报告数据,然后将其传递Session给WebForm.

但是,对于较大的数据集,我建议您将参数传递给Session中的WebForm(QueryString如果它们不敏感,甚至通过它们),然后后面的WebForm代码需要获取数据集和将它绑定到ReportViewer.

在MVC端,在MyController参数post:

    [HttpPost]
    public ActionResult GenerateReport(string param1, int param2)
    {
        // Obviously you apply the parameters as predicates and hit the real database
        Session["ReportData"] = FakeDatabaseData;
        ViewBag.ShowIFrame = true;
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

一旦用户在View上输入ReportParameters,您就可以显示IFrame MyController/GenerateReport:

<iframe src='<%= Url.Content("~/OldSkoolAspx/ReportViewer.aspx") %>' width="100%" height="450px"></iframe>
Run Code Online (Sandbox Code Playgroud)

然后将WebForms页面添加/OldSkoolAspx/ReportViewer.aspx到MVC项目中.在后面的代码中ReportViewer.aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            var reportDataSource = new ReportDataSource
            {
                // Must match the DataSource in the RDLC
                Name = "SomeReportDataSet",
                Value = Session["ReportData"]
            };
            ReportViewer1.LocalReport.DataSources.Add(reportDataSource);
            ReportViewer1.DataBind();
        }
    }
Run Code Online (Sandbox Code Playgroud)

在WebForms ReportViewer.aspx前端,添加控件(建议使用工具箱,以便将所有必需的引用添加到web.config中):

    <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" Font-Size="8pt" WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt" Width="476px">
        <LocalReport ReportPath="MyReport.rdlc">
        </LocalReport>
    </rsweb:ReportViewer>
    <asp:ScriptManager runat="server" ID="SillyPrerequisite"></asp:ScriptManager>
Run Code Online (Sandbox Code Playgroud)

这里有很多活动部件,所以我已经在这里GitHub上传了一个演示项目

请注意,相同的技术也适用于Report Server生成的报告(即使用带有.RDL报告的ReportViewer).但是要小心RDLC和RDL都可以成为真正的SessionState生猪