문제

저는 오늘 일찍 DataDynamics 포럼에서 이 질문을 했습니다.나는 아마도 여기 SO에서 어떤 종류의 반응을 얻을 것이라고 생각했습니다.

ASP.NET MVC 응용 프로그램에서 WebViewer를 실행하려고 합니다.컨트롤러(webViewer.RenderControl(htmlTextWriter))에서 웹 뷰어를 렌더링한 다음 결과를 ViewData에 넣고 내 보기에 보고서를 표시하려고 합니다.나는 이것이 이 문제를 해결하는 올바른 방법인지조차 모르겠습니다.어떤 도움이라도 대단히 감사하겠습니다.

컨트롤러 코드:

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

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>

오류:

개체 참조가 개체의 인스턴스로 설정되지 않았습니다.설명:현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다.오류와 오류가 발생한 코드 위치에 대한 자세한 내용은 스택 추적을 검토하세요.

예외 세부정보:System.NullReferenceException:개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

소스 오류:

60행:var htmlTextWriter = new HtmlTextWriter(stringWriter);61행:webViewer.RenderBeginTag(htmlTextWriter);62행:webViewer.RenderControl(htmlTextWriter);63행:webViewer.RenderEndTag(htmlTextWriter);64행:

소스 파일:C:\Projects\xxxx\xxxx\app\xxxx.Web.Controllers eportsController.cs 줄:62

****업데이트:****

scott(감사합니다)의 답변에 따르면 이제 내 컨트롤러는 다음과 같습니다.

    public ActionResult Display()
    {
        ViewData["Report"] = new DetailedReport { ReportData = new DetailedReport { ReportData = new DetailedData() { Repository = _repository } };
        return View();
    }

그리고 내 견해는 다음과 같습니다.(내 견해에 대한 파일 뒤에 코드가 없습니다).

<%
    var report = (ActiveReport3) ViewData["Report"];
    report.Run();
    WebViewer1.Report = report;
%>
<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />

디버거를 통해 진행되는 것을 보았고 세부 정보 섹션을 올바르게 단계별로 진행하여 내 필드에 값을 입력하는 것 같습니다.그런데 모든 작업이 완료되고 나면 메시지가 옵니다. "지정된 보고서가 없습니다." 나는 다른 곳에서는 코드 숨김 파일을 사용하지 않기 때문에 내 보기에서 코드 숨김 파일을 사용할 필요가 없기를 바라고 있습니다.또한 report.Document.Pages.Count > 0인지 확인하기 위해 디버깅했습니다.WebViewer 컨트롤 위와 아래에 코드 블록을 배치했습니다(별로 중요하지 않다고 생각합니다).추가 의견이 있으신가요?

****업데이트 #2:****

나는 여기에 있는 답변을 사용했습니다. ASP.Net MVC 뷰에서 OnLoad 이벤트를 사용하는 대안은 무엇입니까? 아래 Scott의 훌륭한 답변과 함께.보고서를 생성하고 컨트롤에 바인딩하는 것은 타이밍 문제였습니다.그래서 내보기는 결국 다음과 같습니다 ...(Model.Report는 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>

모두의 도움에 감사드립니다!

도움이 되었습니까?

해결책

이에 대해 내부적으로 조사한 결과 다음과 같은 해결책을 찾았습니다.일반적으로 WebViewer를 뷰에 추가할 수 있습니다.귀하의 예에서는 복잡한 하위 수준 상호 작용 코드가 필요하지 않습니다.대신 WebViewer를 정상적으로 aspx 뷰에 추가하세요.샘플에서는 WebViewer가 다음과 같이 추가되었습니다.

<ActiveReportsWeb:WebViewer ID="WebViewer1" runat="server" Height="100%" Width="100%" ViewerType="AcrobatReader" />

이는 WebViewer가 뷰에서 작동하도록 하는 데 충분합니다.

컨트롤러에서는 다음과 같이 ActiveReport를 지정했습니다.

ViewData["Report"] = new SampleReport();

뷰의 코드 숨김에서 보고서를 뷰에 연결합니다.

WebViewer1.Report = ViewData["Report"] as ActiveReport3;

그런 다음 까다로운 부분이 시작됩니다.AcrobatReader/PDF와 같은 일부 뷰어 유형에 대해 ASP.NET에서 실행될 때 ActiveReports에서 사용되는 일부 IHttpHandler가 있습니다.핸들러가 작동하는지 확인하려면 ASP.NET MVC 라우팅을 얻어 정상적으로 처리할 수 있도록 해야 합니다.다행히도 그렇게 하는 것은 쉽습니다.Global.asax.cs 파일에 다음 코드 줄을 추가하기만 하면 됩니다.

routes.IgnoreRoute("{*allarcachitems}", new { allarcachitems = @".*\.ArCacheItem(/.*)?" });

그러면 경로가 무시됩니다.제가 읽은 내용에 따르면 ASP.NET 라우팅은 이와 같은 단일 "catch all" 경로만 허용하는 것 같기 때문에 문제가 있을 수 있습니다.따라서 이러한 IgnoreRoute 명령이 여러 개 있거나 .axd 파일에 문제가 있는 경우 .axd 및 .ArCacheItem을 수용하도록 제약 조건 사전 인수를 수정해야 합니다.

자세한 내용은 다음 문서를 참조하세요. http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

다음 포럼에서 전체 샘플을 다운로드할 수 있습니다. http://www.datadynamics.com/forums/ShowPost.aspx?PostID=121907#121907

스콧 윌레케
데이터 역학 / GrapeCity

다른 팁

이 문제가 있고 IIS7을 사용하는 다른 사람의 경우 <handlers> 섹션이 아닙니다 <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"/>

나는 404 오류가 발생했기 때문에 무시한 설정을 부적절하게 설정했다고 생각했다. 그러나 나는 IIS7 대신 IIS6 섹션에있는 ActiveEreports가 제공 한 튜토리얼을 따르고있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top