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

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

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

我有一个inheritanceAPIController的ReportController,它有一个返回DataSet的方法。 此DataSet正被发送到RDLC文件。

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

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

public class ReportParameter { public DateTime DateFrom { get; set; } public DateTime DateTo { get; set; } } 

我有以下控制器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(); } } 

我有一个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; } } 

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

 

a.DateFrom, new{id="startDate",style="width:250px;"}) %> a.DateFrom)%>

a.DateTo, new { id = "ToDate", style = "width: 250px;" })%> a.DateTo)%>
   
 

ViewReport.aspx如下:

     

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

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

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

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

详细地
用于在MVC视图上的iframe呈现ReportViewer控件的ViewReport.aspx页面将需要是一个很好的老式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(); } 

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

  

然后将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(); } } 

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

       

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

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