Como posso usar um controle reportviewer em um modo de exibição de asp.net mvc 3?

Eu estou tentando usar um controle reportviewer, dentro de uma visão de razor, no framework mvc 3. A documentação on-line fala de arrastar e soltar. Qualquer sugestão sobre como inseri-lo na exibição.

    A solução a seguir funciona apenas para relatórios de página única. Consulte os comentários para mais detalhes.

    ReportViewer é um controle de servidor e, portanto, não pode ser usado dentro de uma visão de razor. No entanto, você pode adicionar uma página de exibição ASPX, exibir o controle do usuário ou o formulário da Web tradicional que contém um ReportViewer no aplicativo.

    Você precisará garantir que adicionou o manipulador relevante ao seu web.config .

    Se você usar uma página de exibição ASPX ou exibir o controle do usuário, precisará definir AsyncRendering como false para que o relatório seja exibido corretamente.

    Atualizar:

    Adicionado mais código de amostra. Observe que não há alterações significativas necessárias no Global.asax.

    Web.Config

    O meu acabou da seguinte forma:

                                                      

    Controlador

    As ações do controlador são muito simples.

    Como um bônus, a ação File () retorna a saída de “TestReport.rdlc” como um arquivo 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

    O ASPXView é o seguinte.

     <%@ 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

    O controle de usuário ASPX se parece com:

     <%@ 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

    Visão de razor. Requer ViewUserControl1.ascx.

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

    ASPXUserControl

    @Html.Partial("ViewUserControl1")

    Referências

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

    vincular relatório ao reportviewer na web mvc2

    Esta é uma tarefa simples. Você pode seguir os seguintes passos.

    1. Crie uma pasta na sua solução e nomeie-a como Relatórios .
    2. Adicionar um formulário da Web do asp.net e denomine ReportView.aspx
    3. Crie uma class ReportData e adicione-a à pasta Reports . Adicione o seguinte código à 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. Adicione outra class e nomeie-a como ReportBasePage.cs . Adicione o seguinte código nesta 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. Adicione o ScriptManager à página ReportView.aspx . Agora adicione um Report Viewer à página. No visualizador de relatório, defina a propriedade AsyncRendering = “false” . O código é dado abaixo.

          
    6. Adicione dois NameSpace no ReportView.aspx.cs

       using Microsoft.Reporting.WebForms; using System.IO; 
    7. Altere o System.Web.UI.Page para ReportBasePage . Apenas substitua seu código usando o seguinte.

       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. Adicione uma pasta à pasta Relatórios e nomeie-a como relatório . Agora, adicione um relatório RDLC à pasta Reports / Report e nomeie-o como ClosingInventory.rdlc .

    9. Agora adicione um Controlador e nomeie-o como ReportController . No controlador, adicione o seguinte método de ação.

       public ActionResult ReportViewer() { ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; return View(); } 
    10. Adicione uma página de visualização, clique no Controlador ReportViewer . Nomeie a página de visualização ReportViewer.cshtml . Adicione o seguinte código à página de visualização.

       @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. Adicione um iframe . Defina a propriedade do Iframe da seguinte forma

       frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no" 
    12. Adicione o seguinte JavaScript ao visualizador.

       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. Arquivo Web.config adicione a seguinte chave à seção appSettings

       add key="UnobtrusiveJavaScriptEnabled" value="true" 
    14. Na seção de manipuladores system.web , adicione a seguinte chave

       add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
    15. Mude sua fonte de dados para o seu. Esta solução é muito simples e acho que todos irão gostar.

    Estou usando o ASP.NET MVC3 com o SSRS 2008 e não consegui que o @ Adrian’s funcionasse 100% para mim ao tentar obter relatórios de um servidor remoto.

    Finalmente, descobri que precisava alterar o método Page_Load em ViewUserControl1.ascx para ficar assim:

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

    Eu estava perdendo o ProcessingMode.Remote .

    Referências:

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

    Aqui está a solução completa para integrar diretamente um controle visualizador de relatórios (assim como qualquer controle lateral do servidor asp.net) em uma visualização .aspx MVC, que também funcionará em um relatório com várias páginas (diferente da resposta de Adrian Toman) e com AsyncRendering set to true, (baseado em “Pro ASP.NET MVC Framework” por Steve Sanderson).

    O que você precisa fazer é basicamente:

    1. Adicione um formulário com runat = “server”

    2. Adicione o controle, (para controles do visualizador de relatório, ele também pode, às vezes, funcionar mesmo com AsyncRendering = “True”, mas nem sempre, portanto, verifique seu caso específico)

    3. Adicionar scripts do lado do servidor usando tags de script com runat = “server”

    4. Substitua o evento Page_Init pelo código mostrado abaixo, para ativar o uso do PostBack e do Viewstate

    Aqui está uma demonstração:

     

    É claro que é recomendável utilizar totalmente a abordagem MVC, preparando todos os dados necessários no controlador e, em seguida, passando-os para a visualização por meio do ViewModel.

    Isso permitirá a reutilização do View!

    No entanto, isso é dito apenas para dados que são necessários para cada postagem, ou mesmo se eles forem necessários apenas para boot, se os dados não forem intensivos, e os dados também não dependerem dos valores PostBack e ViewState.

    No entanto, até mesmo dados intensivos podem às vezes ser encapsulados em uma expressão lambda e, em seguida, passados ​​para a exibição a ser chamada.

    Um par de notas embora:

    • Ao fazer isso, a visualização se transforma essencialmente em um formulário da Web com todos os seus inconvenientes (ou seja, Postbacks e a possibilidade de os controles não do Asp.NET serem substituídos)
    • O truque de replace o Page_Init é indocumentado e está sujeito a alterações a qualquer momento

    Há um ajudante MvcReportViewer no NuGet.

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

    E estes são os detalhes:

    https://github.com/ilich/MvcReportViewer

    Eu tenho usado isso. Isso funciona muito bem.

    as documentações referem-se a um aplicativo ASP.NET.
    Você pode tentar e dar uma olhada na minha resposta aqui .
    Eu tenho um exemplo anexado à minha resposta.
    Outro exemplo para a ASP.NET MVC3 pode ser encontrado aqui .

    Você não terá apenas que usar uma página asp.net, mas

    Se usar o Entity Framework ou o LinqToSql (se estiver usando classs parciais) mover os dados para um projeto separado, o designer de relatório não poderá ver as classs.

    Mova os relatórios para outro projeto / dll, o VS10 possui bugs onde os projetos do asp.net não podem ver as fonts de dados do object em aplicativos da web. Em seguida, transmitir os relatórios da dll em sua página de aspx de projetos de mvc.

    Isso se aplica a projetos de mvc e webform. Usar relatórios sql no modo local não é uma experiência de desenvolvimento agradável. Além disso, observe a memory do seu servidor da web se exportar relatórios grandes. O reportviewer / export é muito mal projetado.

    É possível obter um relatório do SSRS para aparecer em uma página do MVC sem usar iFrames ou uma página aspx.

    A maior parte do trabalho é explicada aqui:

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

    O link explica como criar um serviço da Web e um método de ação do MVC que permitirá chamar o serviço de geração de relatórios e processar o resultado do serviço da Web como um arquivo do Excel. Com uma pequena alteração no código do exemplo, você pode renderizá-lo como HTML.

    Tudo o que você precisa fazer é usar um botão para chamar uma function javascript que faz uma chamada AJAX para sua ação MVC que retorna o HTML do relatório. Quando a chamada AJAX retornar com o HTML, basta replace uma div por esse HTML.

    Nós usamos AngularJS, então meu exemplo abaixo está nesse formato, mas pode ser qualquer function 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 o método de ação – principalmente tirado do link acima …

      [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); } 

    Portanto, o resultado é que você passa parâmetros para um servidor de relatório do SSRS que retorna um relatório que você renderiza como HTML. Tudo aparece na primeira página. Esta é a melhor solução que pude encontrar