2009-03-20 5 views
13

오늘 나는이 질문을 DataDynamics 포럼에서 요청했습니다. 나는 아마도 여기에 어떤 종류의 응답을 줄 것이라고 생각했다.ASP.NET MVC에서 활성 보고서 WebViewer를 렌더링하는 방법

ASP.NET MVC 응용 프로그램에서 WebViewer를 실행하려고합니다. 컨트롤러 (webViewer.RenderControl (htmlTextWriter))에서 webviewer를 렌더링하고 결과를 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 = 새로운 HtmlTextWriter입니다 (StringWriter를); 라인 61 : webViewer.RenderBeginTag (htmlTextWriter); 62 행 : webViewer.RenderControl (htmlTextWriter); 줄 63 : webViewer.RenderEndTag (htmlTextWriter); 행 64 :

소스 파일 : C : 62

**** 업데이트 : 프로젝트 \ XXXX \ XXXX \ 응용 프로그램 \ xxxx.Web.Controllers \ ReportsController.cs 라인 \ ****

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" /> 

나는 그것이 디버거를 통해 이동보고, 올바르게 내 필드에 값을 넣고, 세부 사항 섹션을 통해 단계로 보인다. 하지만 모두 완료되면 "No Report Specified"메시지가 나타납니다. 다른 곳에서는 사용하지 않기 때문에 필자가보기에 코드 숨김 파일을 사용할 필요가 없기를 바란다. report.Document.Pages.Count> 0인지 확인하기 위해 디버깅했습니다. WebViewer 컨트롤 위와 아래에 코드 블록을 두었습니다 (실제로 중요하지 않다고 생각하지 마십시오). 어떤 추가 생각?

**** 업데이트 # 2 : **** 내가 여기에있는 답변을 사용하여 종료

아래 스캇의 훌륭한 대답과 함께 Alternative to using the OnLoad event in an ASP.Net MVC View?을. 보고서를 생성하여 컨트롤에 바인딩하는 것은 타이밍 과제였습니다. 따라서 내보기는 결국 다음과 같이 보입니다 ... (Model.보고서는 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> 

모두에게 감사드립니다!

답변

10

Google에서 내부적으로 조사한 결과 다음과 같은 해결책이 발견되었습니다. View에 WebViewer를 정상적으로 추가 할 수 있습니다. 귀하의 예에서 복잡한 하위 레벨 상호 작용 코드가 필요하지 않습니다. 대신 WebViewer를 aspx보기에 정상적으로 추가하십시오. 보기에서 작업 웹 뷰어를 얻기에 충분하다

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

을 다음과 같이 우리의 샘플에서 웹 뷰어가 추가되었습니다.

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

보기의 코드 숨김에서 우리가보기에 보고서를 후크 :

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

은 그런 까다로운 부분이 시작 다음과 같이

컨트롤러에서 우리는 ActiveReport를 지정했습니다. 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

스콧 Willeke
데이터 역학에 포럼에서 전체 샘플을 다운로드 할 수 있습니다/그레이프 시티

+0

+1 매우 유용한 정보입니다. 감사합니다. 내가 정리해야 할 유일한 세부 사항은 실제 codebehind 파일 (http://stackoverflow.com/questions/566902 참조)을 사용하는 것을 피하는 방법이었습니다 –

+0

당신의 질문에 대답 해 주어서 기쁩니다. 우리는 코드 숨김을 추가하지 않아야하며, 이벤트 핸들러를 aspx에 추가했습니다. 어쨌든, 그것은 매우 간단합니다, 당신이 해결책을 찾았 기 때문에 기뻤습니다! –

3

다른 사람이이 문제를 가지고 들어를 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 오류를 받고 있었기 때문에 내가 잘못 IgnoreRoute 설정했다 생각했다. 그러나 IIS7 대신 IIS6 섹션에있는 ActiveReports에서 제공하는 자습서를 따르고있었습니다.

관련 문제