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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top