Как я могу использовать элемент управления reportviewer в asp.net MVC 3 razor view?
Я пытаюсь использовать элемент управления reportviewer в представлении razor в рамках MVC 3. Элемент документации разговоры о перетаскивании. Любые предложения о том, как вставить его в поле зрения.
8 ответов:
следующее решение работает только для одностраничных отчетов. См. комментарии для получения более подробной информации.
ReportViewer является серверным элементом управления и, следовательно, не может быть использован в представлении razor. Однако вы можете добавить в приложение страницу просмотра ASPX, пользовательский элемент управления или традиционную веб-форму, содержащую ReportViewer.
вам нужно будет убедиться, что вы добавили соответствующий обработчик в web.конфигурации.
если вы используйте страницу просмотра ASPX или пользовательский элемент управления, который вам нужно будет установить AsyncRendering к false, чтобы получить отчет для отображения должным образом.
обновление:
добавлено больше примеров кода. Примечание в Global не требуется никаких существенных изменений.асакс.
Web.Конфигурации
мой закончился следующим образом:
<?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); } } } } }добавить ScriptManager до ReportView.aspx страница. Теперь добавьте Отчет на странице. В средстве просмотра отчетов установите свойство 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;изменить
Я использую ASP.NET MVC3 с SSRS 2008, и я не мог заставить @Adrian работать на 100% для меня при попытке получить отчеты с удаленного сервера.
наконец, я обнаружил, что мне нужно изменить метод Page_Load в ViewUserControl1.ascx выглядит так:
ReportViewer1.ProcessingMode = ProcessingMode.Remote; ServerReport serverReport = ReportViewer1.ServerReport; serverReport.ReportServerUrl = new Uri("http://<Server Name>/reportserver"); serverReport.ReportPath = "/My Folder/MyReport"; serverReport.Refresh();Я уже давно отсутствует ProcessingMode.Удаленный.
ссылки:
http://msdn.microsoft.com/en-us/library/aa337091.aspx - Элемент
вот полное решение для непосредственной интеграции элемента управления Report-viewer (а также любого asp.net управление на стороне сервера) в MVC .aspx view, который также будет работать над отчетом с несколькими страницами (в отличие от ответа Адриана Томана) и с AsyncRendering, установленным в true (на основе "Pro ASP.NET MVC Framework" Стива Сандерсона).
что нужно сделать в основном:
добавить форму с runat = "server"
добавить control, (для элементов управления Report-viewer он также может иногда работать даже с AsyncRendering="True", но не всегда, поэтому проверьте в своем конкретном случае)
добавление сценариев на стороне сервера с помощью тегов сценариев с runat = "server"
переопределите событие Page_Init с кодом, показанным ниже, чтобы включить использование PostBack и Viewstate
вот пример:
<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>Это, конечно, рекомендуется полностью используйте подход MVC, подготовив все необходимые данные в контроллере, а затем передав их в представление через ViewModel.
Это позволит повторно использовать представления!
однако это только сказано для данных это необходимо для каждого post back, или даже если они требуются только для инициализации, если это не является интенсивным для данных, и данные также не должны зависеть от значений PostBack и ViewState.
однако даже интенсивные данные могут иногда инкапсулируется в лямбда-выражение, а затем передается в представление, которое там вызывается.
несколько заметок, хотя:
- таким образом, представление по существу превращается в веб-форму со всеми его недостатками (т. е. обратными связями и возможностью Asp.NET элементы управления переопределяются)
- взлом переопределения Page_Init является недокументированным, и он может быть изменен в любое время
в NuGet есть помощник MvcReportViewer.
http://www.nuget.org/packages/MvcReportViewer/
и это детали:
https://github.com/ilich/MvcReportViewer
Я использую это. Он отлично работает.
вам не только придется использовать asp.net страница но
при использовании Entity Framework или LinqToSql (при использовании разделяемых классов) переместить данные в отдельный проект, конструктор отчетов не может видеть классы.
переместить отчеты в другой проект / dll, VS10 имеет ошибки были asp.net проекты не могут видеть источники данных объектов в веб-приложениях. Затем поток отчетов из библиотеки dll на страницу MVC projects aspx.
Это относится к проектам mvc и webform. Использование отчетов sql в локальном режиме не является приятным опытом разработки. Также следите за своей памятью веб-сервера при экспорте больших отчетов. Reportviewer / export очень плохо спроектирован.
можно получить отчет SSRS, чтобы появиться на странице MVC без использования iFrames или страницы aspx.
основная часть работы изложена здесь:
ссылка объясняет, как создать веб-службу и метод действия MVC, который позволит вам вызвать службу отчетов и отобразить результат веб-службы в виде файла Excel. С небольшим изменением кода в примере вы можете отобразить его как HTML.
все, что вам нужно сделать, это использовать кнопку для вызова функции javascript, которая вызывает AJAX-вызов вашего действия MVC, который возвращает HTML отчета. Когда вызов AJAX возвращается с HTML, просто замените div этим HTML.
мы используем AngularJS, поэтому мой пример ниже находится в этом формате, но это может быть любой javascript функция
$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); }в результате вы получаете возможность передавать параметры на Сервер отчетов SSRS, который возвращает отчет, который вы отображаете как HTML. Все появляется на одной странице. Это лучшее решение, которое я мог найти
Comments