2011-11-03 10 views
10

Vorrei eseguire il rendering di un report RDLC in HTML all'interno di un progetto ASP.NET MVC.Rendering di un report RDLC in HTML in ASP.NET MVC

Ho realizzato con successo un prototipo che esegue il rendering di un report RDLC in immagini PDF, Excel e TIFF, con l'aiuto di this article. Ma sono rimasto sorpreso dal fatto che HTML non sia uno dei formati predefiniti disponibili in LocalReport.Render().

Mi sono imbattuto in this article, che descrive un trucco per abilitare il formato di rendering di HTML4.0, ma penso che sia solo per un controllo ReportViewer (potrei essere sbagliato però).

La domanda è, in MVC, come eseguire il rendering di un report RDLC in HTML come fa uno ReportView (vedere lo screenshot in basso)?

An RDLC report rendered in a ReportView control

+0

Sto anche cercando di ottenere questo, ma il mio problema è che non sono riuscito a trovare "mostra fonti di dati" nel menu dati. Potresti per favore guidare in quel – Tassadaque

+0

Ho finito per usare invece "Report Wizard". –

+0

ServerReport.Render() supporta "HTML4.0" ma LocalReport.Render() non è –

risposta

5

È possibile utilizzare l'oggetto ReportViewer rendere un RDLC in PDF o HTML. Per il mio caso (sotto) volevo un documento PDF e l'ho restituito come azioneRisultato FileContentResult. Se si desidera che restituisca come download, utilizzare File ActionResult (l'ho commentato per l'utilizzo).

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"); 
    } 
+2

Questo genera un PDF - l'OP ha bisogno di un documento HTML. 'LocalReport.Render()' non supporta HTML in ReportViewer 2010. –

1

ho messo insieme questo progetto secoli fa http://mvcrdlc.codeplex.com/

Dalla memoria ci dovrebbe essere un html di rendere il rdlc così come il PDF

+1

Esiste solo il rendering di Excel e PDF nel repository collegato. –

13

Questo è un compito semplice. Puoi seguire i seguenti passi.

  1. Creare una cartella nella soluzione e assegnare un nome Rapporti.
  2. Aggiungi un modulo web ASP.Net e la chiamò ReportView.aspx
  3. Creare una classe ReportData e inserirlo nella cartella Reports. Aggiungere il seguente codice alla classe.

    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. Aggiungi un'altra Classe e chiamarono ReportBasePage.cs. Aggiungi il seguente codice in questa classe.

    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. Aggiungi ScriptManager alla pagina ReportView.aspx. Ora porta un visualizzatore di report alla pagina. Nel visualizzatore di report impostare la proprietà AsyncRendering = "false". Il codice è riportato di seguito.

    <rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false" 
        Width="1271px" Height="1000px" > 
    </rsweb:ReportViewer> 
    
  6. aggiungere due namespace ReportView.aspx.cs

    using Microsoft.Reporting.WebForms; 
    using System.IO; 
    
  7. Modificare lo System.Web.UI.Page a ReportBasePage. Basta sostituire il codice usando quanto segue.

    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. aggiungere una cartella alla cartella Report e la chiamò Report. Ora aggiungi un rapporto RDLC alla cartella Reports/Report e lo chiami ClosingInventory.rdlc.

  9. Ora aggiungere un controller e la chiamò ReportController. Nel controller aggiungere il seguente metodo di azione.

    public ActionResult ReportViewer() 
    {     
        ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; 
    
        return View(); 
    } 
    
  10. Aggiungi una pagina visualizzata fare clic sul controller ReportViewer. Chiamata la pagina di visualizzazione ReportViewer.cshtml. Aggiungi il seguente codice alla pagina di visualizzazione.

    @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. Aggiungi un Iframe. Impostare la proprietà del Iframe come segue

    frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no" 
    
  12. Add seguito JavaScript per lo spettatore.

    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. Nel file web.config aggiungere la seguente chiave alla sezione appSettings aggiungere

    key="UnobtrusiveJavaScriptEnabled" value="true" 
    
  14. nei gestori System.web Sezione aggiungere la seguente chiave

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

  15. Cambia la tua fonte di dati come tua. Questa soluzione è molto semplice e penso che a tutti piaccia.