오늘 나는이 질문을 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>
모두에게 감사드립니다!
+1 매우 유용한 정보입니다. 감사합니다. 내가 정리해야 할 유일한 세부 사항은 실제 codebehind 파일 (http://stackoverflow.com/questions/566902 참조)을 사용하는 것을 피하는 방법이었습니다 –
당신의 질문에 대답 해 주어서 기쁩니다. 우리는 코드 숨김을 추가하지 않아야하며, 이벤트 핸들러를 aspx에 추가했습니다. 어쨌든, 그것은 매우 간단합니다, 당신이 해결책을 찾았 기 때문에 기뻤습니다! –