簡體   English   中英

在ASP.NET MVC中以HTML格式呈現RDLC報表

[英]Rendering an RDLC report in HTML in ASP.NET MVC

我想在ASP.NET MVC項目中以HTML格式呈現RDLC報告。

本文的幫助下,我成功地制作了一個原型,用於呈現PDF,Excel和TIFF圖像的RDLC報告。 但我很驚訝HTML不是LocalReport.Render()默認的可用格式之一。

我看到了這篇文章 ,它描述了一個啟用HTML4.0渲染格式的技巧,但我認為這只適用於ReportViewer控件(雖然我可能錯了)。

問題是,在MVC中如何像在ReportView中一樣呈現HTML中的RDLC報告(參見下面的屏幕截圖)?

在ReportView控件中呈現的RDLC報表

這是一項簡單的任務。 您可以按照以下步驟操作。

  1. 在解決方案中創建一個文件夾並命名為Reports。
  2. 添加ASP.Net Web表單並將其命名為ReportView.aspx
  3. 創建一個類ReportData並將其添加到Reports文件夾。 將以下代碼添加到類中。

     public class ReportData { public ReportData() { this.ReportParameters = new List<Parameter>(); this.DataParameters = new List<Parameter>(); } public bool IsLocal { get; set; } public string ReportName { get; set; } public List<Parameter> ReportParameters { get; set; } public List<Parameter> DataParameters { get; set; } } public class Parameter { public string ParameterName { get; set; } public string Value { get; set; } } 
  4. 添加另一個類並將其命名為ReportBasePage.cs。 在此類中添加以下代碼。

     public class ReportBasePage : System.Web.UI.Page { protected ReportData ReportDataObj { get; set; } protected override void OnInit(EventArgs e) { base.OnInit(e); if (HttpContext.Current != null) if (HttpContext.Current.Session["ReportData"] != null) { ReportDataObj = HttpContext.Current.Session["ReportData"] as ReportData; return; } ReportDataObj = new ReportData(); CaptureRouteData(Page.Request); } private void CaptureRouteData(HttpRequest request) { var mode = (request.QueryString["rptmode"] + "").Trim(); ReportDataObj.IsLocal = mode == "local" ? true : false; ReportDataObj.ReportName = request.QueryString["reportname"] + ""; string dquerystr = request.QueryString["parameters"] + ""; if (!String.IsNullOrEmpty(dquerystr.Trim())) { var param1 = dquerystr.Split(','); foreach (string pm in param1) { var rp = new Parameter(); var kd = pm.Split('='); if (kd[0].Substring(0, 2) == "rp") { rp.ParameterName = kd[0].Replace("rp", ""); if (kd.Length > 1) rp.Value = kd[1]; ReportDataObj.ReportParameters.Add(rp); } else if (kd[0].Substring(0, 2) == "dp") { rp.ParameterName = kd[0].Replace("dp", ""); if (kd.Length > 1) rp.Value = kd[1]; ReportDataObj.DataParameters.Add(rp); } } } } } 
  5. 將ScriptManager添加到ReportView.aspx頁面。 現在將報告查看器帶到頁面。 在報表查看器中,設置屬性AsyncRendering =“false”。 代碼如下。

     <rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false" Width="1271px" Height="1000px" > </rsweb:ReportViewer> 
  6. 在ReportView.aspx.cs中添加兩個NameSpace

     using Microsoft.Reporting.WebForms; using System.IO; 
  7. 將System.Web.UI.Page更改為ReportBasePage。 只需使用以下代碼替換您的代碼。

     public partial class ReportView : ReportBasePage { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { RenderReportModels(this.ReportDataObj); } } private void RenderReportModels(ReportData reportData) { RASolarERPData dal = new RASolarERPData(); List<ClosingInventoryValuation> objClosingInventory = new List<ClosingInventoryValuation>(); // Reset report properties. ReportViewerRSFReports.Height = Unit.Parse("100%"); ReportViewerRSFReports.Width = Unit.Parse("100%"); ReportViewerRSFReports.CssClass = "table"; // Clear out any previous datasources. this.ReportViewerRSFReports.LocalReport.DataSources.Clear(); // Set report mode for local processing. ReportViewerRSFReports.ProcessingMode = ProcessingMode.Local; // Validate report source. var rptPath = Server.MapPath(@"./Report/" + reportData.ReportName +".rdlc"); //@"E:\\RSFERP_SourceCode\\RASolarERP\\RASolarERP\\Reports\\Report\\" + reportData.ReportName + ".rdlc"; //Server.MapPath(@"./Report/ClosingInventory.rdlc"); if (!File.Exists(rptPath)) return; // Set report path. this.ReportViewerRSFReports.LocalReport.ReportPath = rptPath; // Set report parameters. var rpPms = ReportViewerRSFReports.LocalReport.GetParameters(); foreach (var rpm in rpPms) { var p = reportData.ReportParameters.SingleOrDefault(o => o.ParameterName.ToLower() == rpm.Name.ToLower()); if (p != null) { ReportParameter rp = new ReportParameter(rpm.Name, p.Value); ReportViewerRSFReports.LocalReport.SetParameters(rp); } } //Set data paramater for report SP execution objClosingInventory = dal.ClosingInventoryReport(this.ReportDataObj.DataParameters[0].Value); // Load the dataSource. var dsmems = ReportViewerRSFReports.LocalReport.GetDataSourceNames(); ReportViewerRSFReports.LocalReport.DataSources.Add(new ReportDataSource(dsmems[0], objClosingInventory)); // Refresh the ReportViewer. ReportViewerRSFReports.LocalReport.Refresh(); } } 
  8. 將文件夾添加到Reports文件夾並將其命名為Report。 現在將RDLC報告添加到Reports / Report文件夾並將其命名為ClosingInventory.rdlc。

  9. 現在添加一個Controller並將其命名為ReportController。 在控制器中添加以下操作方法。

     public ActionResult ReportViewer() { ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; return View(); } 
  10. 添加視圖頁面單擊ReportViewer Controller。 將視圖命名為ReportViewer.cshtml。 將以下代碼添加到視圖頁面。

     @using (Html.BeginForm("Login")) { @Html.DropDownList("ddlYearMonthFormat", new SelectList(ViewBag.YearMonthFormat, "YearMonthValue", "YearMonthName"), new { @class = "DropDown" }) Stock In Transit: @Html.TextBox("txtStockInTransit", "", new { @class = "LogInTextBox" }) <input type="submit" onclick="return ReportValidationCheck();" name="ShowReport" value="Show Report" /> } 
  11. 添加iframe。 如下設置Iframe的屬性

     frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no" 
  12. 將以下JavaScript添加到查看器中。

     function ReportValidationCheck() { var url = $('#hdUrl').val(); var yearmonth = $('#ddlYearMonthFormat').val(); var stockInTransit = $('#txtStockInTransit').val() if (stockInTransit == "") { stockInTransit = 0; } if (yearmonth == "0") { alert("Please Select Month Correctly."); } else { //url = url + "dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit; url = "../Reports/ReportView.aspx?rptmode=local&reportname=ClosingInventory&parameters=dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit; var myframe = document.getElementById("ifrmReportViewer"); if (myframe !== null) { if (myframe.src) { myframe.src = url; } else if (myframe.contentWindow !== null && myframe.contentWindow.location !== null) { myframe.contentWindow.location = url; } else { myframe.setAttribute('src', url); } } } return false; } 
  13. 在Web.config文件中,將以下鍵添加到appSettings部分添加

     key="UnobtrusiveJavaScriptEnabled" value="true" 
  14. 在system.web處理程序部分添加以下項

    add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

  15. 將數據源更改為您自己的數據源。 這個解決方案非常簡單,我想每個人都喜歡它。

您可以使用ReportViewer對象將RDLC呈現為PDF或HTML。 對於我的情況(下面),我想要一個PDF文檔,然后將其作為FileContentResult ActionResult返回。 如果你想讓它作為下載返回,請使用File ActionResult(我已經注釋了它供你使用)。

    public ActionResult GetPackingSlipPDF(int shipmentId)
    {
        var shipment = _inboundShipmentService.GetInboundShipmentById(shipmentId);

        Warning[] warnings;
        string mimeType;
        string[] streamids;
        string encoding;
        string filenameExtension;

        var viewer = new ReportViewer();
        viewer.LocalReport.ReportPath = @"Labels\PackingSlip.rdlc";

        var shipLabel = new ShippingLabel { ShipmentId = shipment.FBAShipmentId, Barcode = GetBarcode(shipment.FBAShipmentId) };

        viewer.LocalReport.DataSources.Add(new ReportDataSource("ShippingLabel", new List<ShippingLabel> { shipLabel }));
        viewer.LocalReport.Refresh();

        var bytes = viewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);

        return new FileContentResult(bytes, mimeType);

        //return File(bytes, mimeType, shipment.FBAShipmentId + "_PackingSlip.pdf");
    }

我把這個項目放在一起很久以前http://mvcrdlc.codeplex.com/

從內存中應該有rdlc的html渲染以及PDF

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM