Come posso utilizzare un controllo reportviewer in una vista del razor di asp.net mvc 3?

Sto cercando di utilizzare un controllo reportviewer, all’interno di una vista del razor, nel framework mvc 3. La documentazione online parla di drag and drop. Qualsiasi suggerimento su come inserirlo nella vista.

La seguente soluzione funziona solo per report a pagina singola. Fare riferimento ai commenti per ulteriori dettagli.

ReportViewer è un controllo server e quindi non può essere utilizzato all’interno di una vista del razor. Tuttavia è ansible aggiungere una pagina di visualizzazione ASPX, visualizzare il controllo utente o il modulo Web tradizionale che contiene un ReportViewer nell’applicazione.

Dovrai assicurarti di aver aggiunto il gestore pertinente nel tuo web.config .

Se si utilizza una pagina di visualizzazione ASPX o si visualizza il controllo utente, sarà necessario impostare AsyncRendering su false per visualizzare correttamente il report.

Aggiornare:

Aggiunto più codice di esempio. Nota non ci sono cambiamenti significativi richiesti in Global.asax.

web.Config

Il mio è finito come segue:

                                                  

controllore

Le azioni del controller sono molto semplici.

Come bonus l’azione File () restituisce l’output di “TestReport.rdlc” come file PDF.

 using System.Web.Mvc; using Microsoft.Reporting.WebForms; ... public class PDFController : Controller { public ActionResult Index() { return View(); } public FileResult File() { ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer(); rv.ProcessingMode = ProcessingMode.Local; rv.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc"); rv.LocalReport.Refresh(); byte[] streamBytes = null; string mimeType = ""; string encoding = ""; string filenameExtension = ""; string[] streamids = null; Warning[] warnings = null; streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings); return File(streamBytes, mimeType, "TestReport.pdf"); } public ActionResult ASPXView() { return View(); } public ActionResult ASPXUserControl() { return View(); } } 

ASPXView.apsx

L’ASPXView è il seguente.

 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>    ASPXView   

ViewUserControl1.ascx

Il controllo utente ASPX ha il seguente aspetto:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>  

ASPXUserControl.cshtml

Vista del razor. Richiede ViewUserControl1.ascx.

 @{ ViewBag.Title = "ASPXUserControl"; Layout = "~/Views/Shared/_Layout.cshtml"; } 

ASPXUserControl

@Html.Partial("ViewUserControl1")

Riferimenti

http://blogs.msdn.com/b/sajoshi/archive/2010/06/16/asp-net-mvc-handling-ssrs-reports-with-reportviewer-part-i.aspx

bind il report a reportviewer nel web mvc2

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

  1. Creare una cartella nella soluzione e denominarla Reports .
  2. Aggiungere un modulo Web ASP.Net e denominarlo ReportView.aspx
  3. Creare una class ReportData e aggiungerla alla cartella Reports . Aggiungi il seguente codice alla class.

     public class ReportData { public ReportData() { this.ReportParameters = new List(); this.DataParameters = new List(); } public bool IsLocal { get; set; } public string ReportName { get; set; } public List ReportParameters { get; set; } public List DataParameters { get; set; } } public class Parameter { public string ParameterName { get; set; } public string Value { get; set; } } 
  4. Aggiungi un’altra class e chiamala ReportBasePage.cs . Aggiungi il seguente codice in questa class.

     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 aggiungi un visualizzatore di report alla pagina. Nel visualizzatore di report impostare la proprietà AsyncRendering = “false” . Il codice è riportato di seguito.

        
  6. Aggiungere due NameSpace in ReportView.aspx.cs

     using Microsoft.Reporting.WebForms; using System.IO; 
  7. Modificare System.Web.UI.Page in 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) { // This is the Data Access Layer from which a method is called to fill data to the list. RASolarERPData dal = new RASolarERPData(); List objClosingInventory = new List(); // 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 dei report e denominarla report . Aggiungere un report RDLC alla cartella Reports / Report e denominarlo ClosingInventory.rdlc .

  9. Ora aggiungi un Controller e chiamalo ReportController . Nel controller aggiungere il seguente metodo di azione.

     public ActionResult ReportViewer() { ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; return View(); } 
  10. Aggiungi una pagina di visualizzazione fai clic sul controller di ReportViewer . Denominare 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" })  } 
  11. Aggiungi un Iframe . Imposta la proprietà dell’Iframe come segue

     frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no" 
  12. Aggiungi il seguente JavaScript al visualizzatore.

     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. Il file Web.config aggiunge la seguente chiave alla sezione appSettings

     add key="UnobtrusiveJavaScriptEnabled" value="true" 
  14. Nella sezione system.web handlers aggiungere la seguente chiave

     add 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 origine dati nella tua. Questa soluzione è molto semplice e penso che a tutti piacerà.

Sto usando ASP.NET MVC3 con SSRS 2008 e non ho potuto ottenere da @ Adrian di funzionare al 100% per me quando tento di ottenere i report da un server remoto.

Alla fine, ho scoperto che avevo bisogno di cambiare il metodo Page_Load in ViewUserControl1.ascx per assomigliare a questo:

 ReportViewer1.ProcessingMode = ProcessingMode.Remote; ServerReport serverReport = ReportViewer1.ServerReport; serverReport.ReportServerUrl = new Uri("http:///reportserver"); serverReport.ReportPath = "/My Folder/MyReport"; serverReport.Refresh(); 

Mi era mancato il ProcessingMode.Remote .

Riferimenti:

http://msdn.microsoft.com/en-us/library/aa337091.aspx – ReportViewer

Ecco la soluzione completa per l’integrazione diretta di un controllo di report-viewer (così come qualsiasi controllo laterale del server asp.net) in una vista .aspx MVC, che funzionerà anche su un report con più pagine (a differenza della risposta di Adrian Toman) e con AsyncRendering impostato su true, (basato su “Pro ASP.NET MVC Framework” di Steve Sanderson).

Quello che bisogna fare è fondamentalmente:

  1. Aggiungi un modulo con runat = “server”

  2. Aggiungi il controllo, (per i controlli del visualizzatore di report può anche funzionare a volte anche con AsyncRendering = “True” ma non sempre, quindi controlla nel tuo caso specifico)

  3. Aggiungi scripting lato server usando tag script con runat = “server”

  4. Sostituisci l’evento Page_Init con il codice mostrato di seguito, per abilitare l’uso di PostBack e Viewstate

Ecco una dimostrazione:

 

Si consiglia, ovviamente, di utilizzare appieno l’approccio MVC, preparando tutti i dati necessari nel controller e quindi passandoli alla vista tramite ViewModel.

Ciò consentirà il riutilizzo della vista!

Tuttavia, questo è solo per i dati necessari per ogni postback, o anche se sono richiesti solo per l’inizializzazione se non sono dati intensi, e anche i dati non devono dipendere dai valori di PostBack e ViewState.

Tuttavia, anche i dati intensivi possono a volte essere incapsulati in un’espressione lambda e quindi passati alla vista per essere chiamati lì.

Un paio di note però:

  • In questo modo la vista si trasforma essenzialmente in un modulo Web con tutti i suoi svantaggi, (ad esempio i postback e la possibilità che i controlli di Asp.NET non vengano sovrascritti)
  • L’hack di Overriding Page_Init non è documentato ed è sobject a modifiche in qualsiasi momento

C’è un helper MvcReportViewer in NuGet.

http://www.nuget.org/packages/MvcReportViewer/

E questo è i dettagli:

https://github.com/ilich/MvcReportViewer

Ho usato questo. Funziona alla grande.

la documentazione si riferisce ad un’applicazione ASP.NET.
Puoi provare e dare un’occhiata alla mia risposta qui .
Ho un esempio allegato alla mia risposta.
Un altro esempio per ASP.NET MVC3 può essere trovato qui .

Non dovrai solo usare una pagina di asp.net ma

Se si utilizza Entity Framework o LinqToSql (se si utilizzano classi parziali) spostare i dati in un progetto separato, il progettista del report non può visualizzare le classi.

Spostare i report su un altro progetto / dll, VS10 ha dei bug se i progetti di asp.net non sono in grado di vedere le origini dati dell’object nelle app Web. Quindi esegui il stream dei report dalla DLL nella pagina aspx dei progetti mvc.

Questo vale per i progetti mvc e webform. L’utilizzo di report SQL in modalità locale non è una piacevole esperienza di sviluppo. Guarda anche la memoria del tuo webserver se esporti report di grandi dimensioni. Il reportviewer / export è progettato molto male.

È ansible visualizzare un report SSRS su una pagina MVC senza utilizzare iFrame o una pagina aspx.

La maggior parte del lavoro è spiegato qui:

http://geekswithblogs.net/stun/archive/2010/02/26/executing-reporting-services-web-service-from-asp-net-mvc-using-wcf-add-service-reference.aspx

Il collegamento spiega come creare un servizio Web e un metodo di azione MVC che consentano di chiamare il servizio di reporting e di rendere il risultato del servizio Web come un file Excel. Con una piccola modifica al codice nell’esempio, puoi renderlo come HTML.

Tutto ciò che devi fare è utilizzare un pulsante per chiamare una funzione javascript che effettua una chiamata AJAX all’azione MVC che restituisce l’HTML del report. Quando la chiamata AJAX ritorna con l’HTML, sostituisci semplicemente un div con questo HTML.

Usiamo AngularJS quindi il mio esempio qui sotto è in quel formato, ma potrebbe essere qualsiasi funzione javascript

 $scope.getReport = function() { $http({ method: "POST", url: "Report/ExportReport", data: [ { Name: 'DateFrom', Value: $scope.dateFrom }, { Name: 'DateTo', Value: $scope.dateTo }, { Name: 'LocationsCSV', Value: $scope.locationCSV } ] }) .success(function (serverData) { $("#ReportDiv").html(serverData); }); }; 

E il metodo di azione – principalmente tratto dal link sopra …

  [System.Web.Mvc.HttpPost] public FileContentResult ExportReport([FromBody]List parameters) { byte[] output; string extension, mimeType, encoding; string reportName = "/Reports/DummyReport"; ReportService.Warning[] warnings; string[] ids; ReportExporter.Export( "ReportExecutionServiceSoap" new NetworkCredential("username", "password", "domain"), reportName, parameters.ToArray(), ExportFormat.HTML4, out output, out extension, out mimeType, out encoding, out warnings, out ids ); //------------------------------------------------------------- // Set HTTP Response Header to show download dialog popup //------------------------------------------------------------- Response.AddHeader("content-disposition", string.Format("attachment;filename=GeneratedExcelFile{0:yyyyMMdd}.{1}", DateTime.Today, extension)); return new FileContentResult(output, mimeType); } 

Il risultato è che si arriva a passare i parametri a un server di report SSRS che restituisce un report che viene visualizzato come HTML. Tutto appare in un’unica pagina. Questa è la soluzione migliore che ho trovato