asp.net mvc 3 면도기보기에서 reportviewer 컨트롤을 어떻게 사용할 수 있습니까?
mvc 3 프레임 워크에서 면도기보기에서 reportviewer 컨트롤을 사용합니다. 온라인 설명서는 드래그 앤 드롭의 이야기. 보기에 삽입하는 방법에 대한 제안.
다음 솔루션은 단일 페이지 보고서에만 적용됩니다. 자세한 내용은 주석을 참조하십시오.
ReportViewer는 서버 컨트롤을 배포 기보기 내에서 사용할 수 없습니다. 그러나 ASPX보기 페이지,보기 사용자 정의 컨트롤 또는 ReportViewer가 포함 된 기존 웹 양식을 응용 프로그램에 추가 할 수 있습니다.
web.config에 관련된 추가 를 추가로 확인해야합니다 .
ASPX보기 페이지를 사용하거나 사용자 정의 컨트롤을 보는 경우 AsyncRendering을 false로 설정해야 보고서가 제대로 표시됩니다.
최신 정보 :
더 많은 샘플 코드를 추가했습니다. Global.asax는 의미있는 변경이 필요하지 않습니다.
Web.Config
광산은 다음과 같이 끝났습니다.
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=152368
-->
<configuration>
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
<add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
<handlers>
<add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
제어 장치
컨트롤러 동작은 매우 간단합니다.
보너스로 File () 액션은 "TestReport.rdlc"의 출력을 PDF 파일로 반환합니다.
using System.Web.Mvc;
using Microsoft.Reporting.WebForms;
...
public class PDFController : Controller
{
public ActionResult Index()
{
return View();
}
public FileResult File()
{
ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
rv.ProcessingMode = ProcessingMode.Local;
rv.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
rv.LocalReport.Refresh();
byte[] streamBytes = null;
string mimeType = "";
string encoding = "";
string filenameExtension = "";
string[] streamids = null;
Warning[] warnings = null;
streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
return File(streamBytes, mimeType, "TestReport.pdf");
}
public ActionResult ASPXView()
{
return View();
}
public ActionResult ASPXUserControl()
{
return View();
}
}
ASPXView.apsx
ASPXView는 다음과 가변합니다.
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title>ASPXView</title>
</head>
<body>
<div>
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
ReportViewer1.LocalReport.Refresh();
}
</script>
<form id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<rsweb:reportviewer id="ReportViewer1" runat="server" height="500" width="500" AsyncRendering="false"></rsweb:reportviewer>
</form>
</div>
</body>
</html>
ViewUserControl1.ascx
ASPX 사용자 정의 컨트롤은 다음과 가변합니다.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/TestReport.rdlc");
ReportViewer1.LocalReport.Refresh();
}
</script>
<form id="Form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer1" runat="server" AsyncRendering="false"></rsweb:ReportViewer>
</form>
ASPXUserControl.cshtml
면도기보기. ViewUserControl1.ascx가 필요합니다.
@{
ViewBag.Title = "ASPXUserControl";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>ASPXUserControl</h2>
@Html.Partial("ViewUserControl1")
참고 문헌
이 간단한 작업입니다. 다음 단계를 따를 수 있습니다.
- 솔루션에 폴더를 만들고 이름을 보고서로 지정합니다 .
- ASP.Net 웹 양식을 추가하고 이름을 ReportView.aspx로 지정합니다 .
ReportData 클래스 를 만들고 보고서 폴더에 추가 합니다. 클래스에 다음 코드를 추가합니다.
public class ReportData { public ReportData() { this.ReportParameters = new List<Parameter>(); this.DataParameters = new List<Parameter>(); } public bool IsLocal { get; set; } public string ReportName { get; set; } public List<Parameter> ReportParameters { get; set; } public List<Parameter> DataParameters { get; set; } } public class Parameter { public string ParameterName { get; set; } public string Value { get; set; } }
다른 클래스를 추가하고 이름을 ReportBasePage.cs로 지정합니다 . 이 클래스에 다음 코드를 추가하십시오.
public class ReportBasePage : System.Web.UI.Page { protected ReportData ReportDataObj { get; set; } protected override void OnInit(EventArgs e) { base.OnInit(e); if (HttpContext.Current != null) if (HttpContext.Current.Session["ReportData"] != null) { ReportDataObj = HttpContext.Current.Session["ReportData"] as ReportData; return; } ReportDataObj = new ReportData(); CaptureRouteData(Page.Request); } private void CaptureRouteData(HttpRequest request) { var mode = (request.QueryString["rptmode"] + "").Trim(); ReportDataObj.IsLocal = mode == "local" ? true : false; ReportDataObj.ReportName = request.QueryString["reportname"] + ""; string dquerystr = request.QueryString["parameters"] + ""; if (!String.IsNullOrEmpty(dquerystr.Trim())) { var param1 = dquerystr.Split(','); foreach (string pm in param1) { var rp = new Parameter(); var kd = pm.Split('='); if (kd[0].Substring(0, 2) == "rp") { rp.ParameterName = kd[0].Replace("rp", ""); if (kd.Length > 1) rp.Value = kd[1]; ReportDataObj.ReportParameters.Add(rp); } else if (kd[0].Substring(0, 2) == "dp") { rp.ParameterName = kd[0].Replace("dp", ""); if (kd.Length > 1) rp.Value = kd[1]; ReportDataObj.DataParameters.Add(rp); } } } } }
ReportView.aspx 페이지에 ScriptManager 를추가합니다. 이제페이지에 보고서 뷰어 를추가합니다. 보고서 뷰어에서 AsyncRendering = "false" 속성을 설정합니다. 코드는 다음과 가변적입니다.
<rsweb:ReportViewer ID="ReportViewerRSFReports" runat="server" AsyncRendering="false" Width="1271px" Height="1000px" > </rsweb:ReportViewer>
두 개의 추가 이름 공간 에서 ReportView.aspx.cs을
using Microsoft.Reporting.WebForms; using System.IO;
는 System.Web.UI.Page 를 ReportBasePage로 변경합니다. 다음을 사용하여 코드를 바꾸십시오.
public partial class ReportView : ReportBasePage { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { RenderReportModels(this.ReportDataObj); } } private void RenderReportModels(ReportData reportData) { // This is the Data Access Layer from which a method is called to fill data to the list. RASolarERPData dal = new RASolarERPData(); List<ClosingInventoryValuation> objClosingInventory = new List<ClosingInventoryValuation>(); // Reset report properties. ReportViewerRSFReports.Height = Unit.Parse("100%"); ReportViewerRSFReports.Width = Unit.Parse("100%"); ReportViewerRSFReports.CssClass = "table"; // Clear out any previous datasources. this.ReportViewerRSFReports.LocalReport.DataSources.Clear(); // Set report mode for local processing. ReportViewerRSFReports.ProcessingMode = ProcessingMode.Local; // Validate report source. var rptPath = Server.MapPath(@"./Report/" + reportData.ReportName +".rdlc"); //@"E:\RSFERP_SourceCode\RASolarERP\RASolarERP\Reports\Report\" + reportData.ReportName + ".rdlc"; //Server.MapPath(@"./Report/ClosingInventory.rdlc"); if (!File.Exists(rptPath)) return; // Set report path. this.ReportViewerRSFReports.LocalReport.ReportPath = rptPath; // Set report parameters. var rpPms = ReportViewerRSFReports.LocalReport.GetParameters(); foreach (var rpm in rpPms) { var p = reportData.ReportParameters.SingleOrDefault(o => o.ParameterName.ToLower() == rpm.Name.ToLower()); if (p != null) { ReportParameter rp = new ReportParameter(rpm.Name, p.Value); ReportViewerRSFReports.LocalReport.SetParameters(rp); } } //Set data paramater for report SP execution objClosingInventory = dal.ClosingInventoryReport(this.ReportDataObj.DataParameters[0].Value); // Load the dataSource. var dsmems = ReportViewerRSFReports.LocalReport.GetDataSourceNames(); ReportViewerRSFReports.LocalReport.DataSources.Add(new ReportDataSource(dsmems[0], objClosingInventory)); // Refresh the ReportViewer. ReportViewerRSFReports.LocalReport.Refresh(); } }
보고서 폴더에폴더를 추가하고 이름을 보고서로 지정합니다. 이제 RDLC 보고서를 보고서 / 보고서 폴더에 추가하고 이름을 ClosingInventory.rdlc로 지정합니다.
이제 컨트롤러를 추가하고 이름을 ReportController로 지정합니다 . 컨트롤러에서 다음 작업 방법을 추가하십시오.
public ActionResult ReportViewer() { ViewData["reportUrl"] = "../Reports/View/local/ClosingInventory/"; return View(); }
ReportViewer 컨트롤러를클릭하여보기 페이지를 추가합니다. 보기 페이지의 이름을 ReportViewer.cshtml로 지정 합니다. 보기 페이지에 다음 코드를 추가하십시오.
@using (Html.BeginForm("Login")) { @Html.DropDownList("ddlYearMonthFormat", new SelectList(ViewBag.YearMonthFormat, "YearMonthValue", "YearMonthName"), new { @class = "DropDown" }) Stock In Transit: @Html.TextBox("txtStockInTransit", "", new { @class = "LogInTextBox" }) <input type="submit" onclick="return ReportValidationCheck();" name="ShowReport" value="Show Report" /> }
Iframe을 추가합니다. Iframe의 속성을 다음과 같이 설정합니다.
frameborder="0" width="1000"; height="1000"; style="overflow:hidden;" scrolling="no"
뷰어에 다음 JavaScript를 추가하십시오.
function ReportValidationCheck() { var url = $('#hdUrl').val(); var yearmonth = $('#ddlYearMonthFormat').val(); var stockInTransit = $('#txtStockInTransit').val() if (stockInTransit == "") { stockInTransit = 0; } if (yearmonth == "0") { alert("Please Select Month Correctly."); } else { //url = url + "dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit; url = "../Reports/ReportView.aspx?rptmode=local&reportname=ClosingInventory¶meters=dpSpYearMonth=" + yearmonth + ",rpYearMonth=" + yearmonth + ",rpStockInTransit=" + stockInTransit; var myframe = document.getElementById("ifrmReportViewer"); if (myframe !== null) { if (myframe.src) { myframe.src = url; } else if (myframe.contentWindow !== null && myframe.contentWindow.location !== null) { myframe.contentWindow.location = url; } else { myframe.setAttribute('src', url); } } } return false; }
Web.config 파일은 appSettings 섹션에다음 키를 추가합니다.
add key="UnobtrusiveJavaScriptEnabled" value="true"
에서 system.web의 처리기 섹션은 다음 키를 추가
add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
데이터 소스를 자신의 변경하십시오. 이 솔루션은 매우 간단하며 누구나 즐길 수 있습니다.
SSRS 2008과 함께 ASP.NET MVC3를 사용하고 있는데 원격 서버에서 보고서를 가져 오려고 할 때 @Adrian이 100 % 작동 할 수 없습니다.
마지막으로 ViewUserControl1.ascx 의 Page_Load 메소드 를 다음과 같이 변경해야한다는 것을 알았 습니다.
ReportViewer1.ProcessingMode = ProcessingMode.Remote;
ServerReport serverReport = ReportViewer1.ServerReport;
serverReport.ReportServerUrl = new Uri("http://<Server Name>/reportserver");
serverReport.ReportPath = "/My Folder/MyReport";
serverReport.Refresh();
ProcessingMode . Remote가 없음 .
참조 :
http://msdn.microsoft.com/en-us/library/aa337091.aspx- 의 ReportViewer
다음은 MVC .aspx보기에서 보고서 뷰어 컨트롤 (asp.net 서버 측 컨트롤 포함)을 직접 통합하기위한 완벽한 솔루션입니다.이보기는 Adrian Toman의 답변과 달리 여러 페이지가있는 보고서를 작동합니다. AsyncRendering이 true로 설정되었습니다 (Steve Sanderson의 "Pro ASP.NET MVC Framework"기반).
기본적으로해야 할 일 다음과 가변합니다.
runat = "server"를 사용하여 양식 추가
(보고서 뷰어 컨트롤의 경우 AsyncRendering = "True"작동 작동 가능 여부 항상 확인)
runat = "server"와 함께 펼쳐지는 태그를 사용하여 서버 측 스크립팅 추가
PostBack을 사용하는 것보다 아래 및 코드로 Page_Init 이벤트를 재정의하십시오.
다음은 견본입니다.
<form ID="form1" runat="server">
<rsweb:ReportViewer ID="ReportViewer1" runat="server" />
</form>
<script runat="server">
protected void Page_Init(object sender, EventArgs e)
{
Context.Handler = Page;
}
//Other code needed for the report viewer here
</script>
물론 컨트롤러에서 필요한 모든 데이터를 준비한 다음 ViewModel을 통해 뷰에 전달하여 MVC 접근을 완전히 활용하는 것이 좋습니다.
이렇게하면 View!
그러나 모든 포스트 백에 필요하거나 데이터 집약적이지 않고 데이터가 PostBack 및 ViewState 값에 없지 않는 경우에만 존재하는 경우에도 데이터에 초기화됩니다.
그러나 데이터 집약적 인 경우에도 람다 식으로 캡슐화 한 다음 뷰로 전달하여 호출 할 수 있습니다.
하지만 몇 가지 참고 사항 :
- 이렇게 뷰는 기본으로 모든 취약점이있는 웹 양식으로 바칠니다 (예 : 포스트 백 및 재정의 될 가능성).
- Page_Init 재정의 해킹은 문서화되지 않습니다.
NuGet에는 MvcReportViewer 도우미가 있습니다.
http://www.nuget.org/packages/MvcReportViewer/
그리고 이것은 세부 사항입니다.
https://github.com/ilich/MvcReportViewer
나는 이것을 사용하고 있습니다. 잘 작동합니다.
설명서는 ASP.NET 응용 프로그램을 참조합니다. 여기
에서 내 대답을 시도하고 볼 수 있습니다 .
답장에 예가 첨부되어 있습니다.
ASP.NET MVC3에 대한 또 다른 예는 여기 에서 찾을 수 있습니다 .
asp.net 페이지를 사용해야 할뿐만 아니라
Entity Framework 또는 LinqToSql (부분 클래스를 사용하는 경우)을 사용하는 경우 데이터를 별도의 프로젝트로 이동하면 보고서 디자이너가 클래스를 볼 수 없습니다.
보고서를 다른 프로젝트 / dll로 이동하면 VS10에는 asp.net 프로젝트가 웹 앱에서 개체 데이터 소스를 볼 수없는 버그가 있습니다. 그런 다음 dll의 보고서를 mvc 프로젝트 aspx 페이지로 스트리밍합니다.
이는 mvc 및 웹 양식 프로젝트에 적용됩니다. 로컬 모드에서 SQL 보고서를 사용하는 것은 즐거운 개발 경험이 아닙니다. 또한 큰 보고서를 내보내는 경우 웹 서버 메모리를 확인하십시오. reportviewer / export가 매우 잘못 설계되었습니다.
iFrames 또는 aspx 페이지를 사용하지 않고 MVC 페이지에 SSRS 보고서를 표시 할 수 있습니다.
작업의 대부분은 여기에 설명되어 있습니다.
이 링크는보고 서비스를 호출하고 웹 서비스의 결과를 Excel 파일로 렌더링 할 수있는 웹 서비스 및 MVC 작업 메서드를 만드는 방법을 설명합니다. 예제의 코드를 약간 변경하면 HTML로 렌더링 할 수 있습니다.
그런 다음 버튼을 사용하여 보고서의 HTML을 반환하는 MVC 작업을 AJAX 호출하는 자바 스크립트 함수를 호출하면됩니다. AJAX 호출이 HTML로 반환되면 div를이 HTML로 바꾸십시오.
AngularJS를 사용하므로 아래 예제는 해당 형식이지만 모든 자바 스크립트 함수가 될 수 있습니다.
$scope.getReport = function()
{
$http({
method: "POST",
url: "Report/ExportReport",
data:
[
{ Name: 'DateFrom', Value: $scope.dateFrom },
{ Name: 'DateTo', Value: $scope.dateTo },
{ Name: 'LocationsCSV', Value: $scope.locationCSV }
]
})
.success(function (serverData)
{
$("#ReportDiv").html(serverData);
});
};
그리고 액션 방법-주로 위의 링크에서 가져온 것입니다.
[System.Web.Mvc.HttpPost]
public FileContentResult ExportReport([FromBody]List<ReportParameterModel> parameters)
{
byte[] output;
string extension, mimeType, encoding;
string reportName = "/Reports/DummyReport";
ReportService.Warning[] warnings;
string[] ids;
ReportExporter.Export(
"ReportExecutionServiceSoap"
new NetworkCredential("username", "password", "domain"),
reportName,
parameters.ToArray(),
ExportFormat.HTML4,
out output,
out extension,
out mimeType,
out encoding,
out warnings,
out ids
);
//-------------------------------------------------------------
// Set HTTP Response Header to show download dialog popup
//-------------------------------------------------------------
Response.AddHeader("content-disposition", string.Format("attachment;filename=GeneratedExcelFile{0:yyyyMMdd}.{1}", DateTime.Today, extension));
return new FileContentResult(output, mimeType);
}
따라서 결과는 HTML로 렌더링하는 보고서를 반환하는 SSRS보고 서버에 매개 변수를 전달하는 것입니다. 모든 것이 한 페이지에 나타납니다. 이것이 제가 찾을 수있는 최고의 솔루션입니다
'ProgramingTip' 카테고리의 다른 글
Lisp는 어떻게 언어 자체를 재정의 할 수 있습니까? (0) | 2020.12.04 |
---|---|
하나의 LINQ 쿼리에서 두 열의 가져 오기 오기 (0) | 2020.12.04 |
모듈에서 'before_save'콜백을 정의 할 수 있습니까? (0) | 2020.12.04 |
이 C ++ 코드에서 여기서 무슨 일이 일어나고 있습니까? (0) | 2020.12.04 |
날짜에서 요일 이름을 얻는 방법은 무엇입니까? (0) | 2020.12.04 |