Como tornar ActiveReports Web Viewer em ASP.NET MVC
-
21-08-2019 - |
Pergunta
Eu fiz esta pergunta no fórum DataDynamics hoje cedo. Eu pensei que talvez eu obter algum tipo de resposta aqui no SO.
Eu estou tentando obter o WebViewer instalado e funcionando em minha aplicação ASP.NET MVC. Eu estou tentando tornar o webviewer no controlador (webViewer.RenderControl (HtmlTextWriter) e, em seguida, colocar os resultados em ViewData e exibir o relatório na minha opinião. Eu não' mesmo sei se esta é a maneira correta de fazer isso. Qualquer ajuda seria muito apreciada.
Código Controlador:
public ActionResult Display()
{
CurrentReport = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
var webViewer = new WebViewer();
CurrentReport.Run();
webViewer.ID = "WebViewer1";
webViewer.Visible = true;
webViewer.ViewerType = ViewerType.HtmlViewer;
webViewer.Width = Unit.Percentage(100);
webViewer.Report = CurrentReport;
var stringWriter = new StringWriter();
var htmlTextWriter = new HtmlTextWriter(stringWriter);
webViewer.RenderBeginTag(htmlTextWriter);
webViewer.RenderControl(htmlTextWriter);
webViewer.RenderEndTag(htmlTextWriter);
ViewData["WebViewer"] = stringWriter.ToString();
return View();
}
Código Display.aspx:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Admin.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Register assembly="ActiveReports.Web, Version=5.2.1013.2, Culture=neutral, PublicKeyToken=cc4967777c49a3ff" namespace="DataDynamics.ActiveReports.Web" tagprefix="ActiveReportsWeb" %>
<%@ Import Namespace="xxxx.Core"%>
<asp:Content ID="Content1" ContentPlaceHolderID="ClientAdminContent" runat="server">
<%=ViewData["WebViewer"] %>
</asp:Content>
Erro:
objecto de referência não definida para uma instância de um objecto. Descrição: Uma exceção não tratada ocorreu durante a execução da solicitação da web atual. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.
Exceção detalhes: System.NullReferenceException:. Referência de objeto não definida para uma instância de um objeto
Fonte de erro:
Linha 60: var HtmlTextWriter = new HtmlTextWriter (StringWriter); Linha 61: webViewer.RenderBeginTag (HtmlTextWriter); Linha 62: webViewer.RenderControl (HtmlTextWriter); Linha 63: webViewer.RenderEndTag (HtmlTextWriter); Linha 64:
Fonte arquivo: C: \ Projects \ xxxx \ xxxx \ app \ xxxx.Web.Controllers \ ReportsController.cs Line: 62
**** Update: ****
Com base na resposta por Scott (obrigado) meu controlador agora se parece com isso:
public ActionResult Display()
{
ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
return View();
}
E meus view parece com isso: (não tenho código por trás de arquivos para os meus pontos de vista)
.<%
var report = (ActiveReport3) ViewData["Report"];
report.Run();
WebViewer1.Report = report;
%>
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
Eu vê-lo passar por depurador, e parece corretamente passo através da seção de detalhes, colocando valores em meus campos. Mas depois de tudo é feito, eu recebo a mensagem "No relatório especificado." Eu estou esperando que eu realmente não tem que usar um arquivo codebehind no meu ponto de vista, porque eu não estou usando-os em qualquer lugar outro. Eu também tenho depurado para verificar se report.Document.Pages.Count> 0. Eu coloquei o bloco de código acima e abaixo do controle WebViewer (não acho que realmente importa). Quaisquer pensamentos adicionais?
**** Atualização # 2: ****
Acabei usando a resposta encontrada aqui: alternativa para usar o evento OnLoad em uma ASP.Net MVC Ver em combinação com excelente resposta de scott abaixo. Era uma coisa sincronismo com a geração e a ligação relatório para o controle. Então meus view parece com isso no final ... (onde Model.Report é um ActiveReport3)
<script runat="server">
private void Page_Load(object sender, EventArgs e)
{
var report = Model.Report;
report.Run();
WebViewer1.Report = report;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ClientAdminContent" runat="server">
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
</asp:Content>
Obrigado pela ajuda de todos!
Solução
Nós investigamos isso internamente e encontrou a seguinte solução. Você pode adicionar o WebViewer para uma vista normalmente. Não há necessidade do código interação de baixo nível complicado no seu exemplo. Em vez disso, basta adicionar o WebViewer à sua vista aspx normalmente. Em nossa amostra do WebViewer foi adicionado o seguinte:
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />
Isso é suficiente para obter o WebViewer trabalhando no modo de exibição.
No controlador de nós especificado um ActiveReport da seguinte forma:
ViewData["Report"] = new SampleReport();
No codebehind da Vista de nós ligar o relatório à vista:
WebViewer1.Report = ViewData["Report"] as ActiveReport3;
Em seguida, a parte difícil começa. Há algumas IHttpHandlers usados ??por ActiveReports quando executados no ASP.NET para alguns dos tipos de espectador, como AcrobatReader / PDF. Para garantir que nossos manipuladores estão trabalhando você deve obter ASP.NET MVC encaminhamento para permitir que eles processo como normal. Felizmente, é fácil fazê-lo. Basta adicionar a seguinte linha de código para o arquivo Global.asax.cs:
routes.IgnoreRoute("{*allarcachitems}", new { allarcachitems = @".*\.ArCacheItem(/.*)?" });
Isso irá ignorar a rota. Note-se que de acordo com minha leitura pode haver problemas desde roteamento ASP.NET parece permitir apenas um único "catch all" rota como esta. Portanto, se você tiver vários destes comandos IgnoreRoute e ou você tem quaisquer problemas com um arquivo .axd, você vai precisar modificar as restrições argumento dicionário para accomidate a .axd, bem como .ArCacheItem.
Para mais informações consulte o seguinte artigo: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Você pode baixar a amostra completa de nossos fóruns em http: // www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907
Scott Willeke
Dados Dynamics / GrapeCity
Outras dicas
Para qualquer outra pessoa tendo esta questão e usando IIS7 Certifique-se de adicionar os relatórios manipuladores de ativos sob a seção <handlers>
não <httpHandlers>
.
<add name="RPX" verb="*" path="*.rpx" type="DataDynamics.ActiveReports.Web.Handlers.RpxHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>
<add name="ActiveReport" verb="*" path="*.ActiveReport" type="DataDynamics.ActiveReports.Web.Handlers.CompiledReportHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>
<add name="ArCacheItem" verb="*" path="*.ArCacheItem" type="DataDynamics.ActiveReports.Web.Handlers.WebCacheAccessHandler, ActiveReports.Web, Version=6.1.2814.0, Culture=neutral, PublicKeyToken=cc4967777c49a3ff"/>
Eu pensei que tinha a configuração IgnoreRoute indevidamente porque eu estava recebendo 404 erros. No entanto, eu estava seguindo o tutorial dada pelo ActiveReports qual deles tem na seção IIS6 em vez de IIS7.