在ASP.net MVC站点查看SSRS报告

有没有办法将SQL Server Reporting Services报表查看器控件放在ASP.net MVC视图上? 如果没有…什么是完成这个最好的方法?

不,不是在MVC视图。 但是,你可以有一个Web表单页面,其中的服务器控件混合在你的MVC网站。

嗯,只是用googlesearch“混合asp.net mvc和networking表单”来find一些例子,谷歌质疑我是否是人类或不:)

无论如何,这里有一个链接 – http://www.packtpub.com/article/mixing-asp.net-webforms-and-asp.net-mvc – 那里有几个。 我也在一个MVC站点做了这个,出于同样的原因 – 报告控制。

不,ReportViewer控件如果放置在MVC视图中将不起作用,因为它需要ViewState。 您必须创build一个老派的Web表单,并把ReportViewer放在那里。

我在一个项目中使用的解决scheme是创build一个自定义的路由处理程序,所以我仍然可以使用URL路由。 路由处理程序将从RouteData集合中获取类似报告名称的参数,创build我的Web表单实例,并通过公共属性将parameter passing给它。 Web表单将在Page_Load中读取并configurationReportViewer控件。

// Configure a route in Global.asax.cs that is handled by a ReportRouteHandler routes.Add("ReportRoute", new Route("Reports/{reportName}", new ReportRouteHandler()); public class ReportRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { var reportName = requestContext.RouteData.Values["reportName"] as string; var webform = BuildManager .CreateInstanceFromVirtualPath("~/Path/To/ReportViewerWebForm.aspx", typeof(Page)) as ReportViewerWebForm; webform.ReportToShow = reportName; return webform; } } 

当然,如果你决定使用这种方法,这个代码只是一个起点。 我创build的一个也做了一些用户authentication和参数validation之前返回。

更新 :看起来如果你正在使用ASP.NET 4.0, 大部分都可以自动完成 !

现在有一个MvcReportViewer帮手。 我们可以从NuGet中获得。

GitHub上的项目网站

NuGet包

更新MVC 4.0

正如@BrantBobby所指出的那样,MVC 4.0有一种原生的方式来处理混合MVC和表单。
Scott Guthrie在使用ASP.NET 4 Web Forms的URL路由方面有很棒的文章,但是这里是SSRS报告查看器的特定实现

首先添加一个Map Page Route到RouteConfig(注意页面部分):

 routes.MapPageRoute( routeName:="ReportViewer", routeUrl:="Reports/{reportName}", physicalFile:="~/WebForms/ReportViewer.aspx" ) 

routeUrl是你需要调用的,它会自动挂接到physicalFilepath

实施前的一些家务事项:

  • 确保在您的项目中添加对Microsoft.ReportViewer.WebForms的引用
  • 你将需要一个httpHandler在你的web.configsystem.web部分是这样的:

     <system.web> <httpHandlers> <add path="Reserved.ReportViewerWebControl.axd" verb="*" validate="false" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </httpHandlers> </system.web> 

现在我们准备添加一个带有ReportViewer的WebForm。

创build一个ASPX页面,对应于您的路线中的物理文件path。 在这种情况下,我在根目录下添加了一个名为WebForms的文件夹,并在其中添加了ReportViewer.aspx

ReportViewer.aspx中

 <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="ReportViewer.aspx.vb" Inherits="Interface.ReportViewer" %> <%@ Register Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %> <!DOCTYPE html > <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"></head> <body> <form id="form1" runat="server"> <rsweb:ReportViewer ID="ReportViewer" runat="server" SizeToReportContent="True" /> <asp:ScriptManager ID="ScriptManager1" runat="server" /> </form> </body> </html> 

ReportViewer.aspx.vb中

 Imports Microsoft.Reporting.WebForms Public Class ReportViewer : Inherits Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not Page.IsPostBack Then ' Retrieve parameter from Route "Reports/{reportName}" Dim reportName = CStr(Page.RouteData.Values("reportName")) Page.Title = reportName ReportViewer.ProcessingMode = ProcessingMode.Remote Dim serverReport As ServerReport serverReport = ReportViewer.ServerReport serverReport.ReportServerUrl = New Uri("http://" & Globals.ReportServer & "/ReportServer") serverReport.ReportPath = Globals.ReportServerPath & reportName ' add parameters here 'Dim param As New ReportParameter("name", "value") 'serverReport.SetParameters(param) serverReport.Refresh() End If End Sub End Class 

只要您导航到地址~/Reports/reportName ,报告就会运行

一个简单的解决scheme是添加一个iframe到您的MVC视图,从报告服务Web服务打开您想要的报告。 iframe将完全与来自报告服务的组件一起运行。 iframe中用于url的参数也可以dynamic控制(例如使用ajax),如果您想将组件移出到您的MVC视图。

虽然这可行,但您仍然必须login到networking报告服务(iframe将打开login对话框)。 对于IE来说,这是“自动”完成,虽然使用您的Windowslogin凭据。

这有点简单,需要一些修正,以传递一些像样的MVC视图

 public ActionResult Index() { /*Credentials of a user that has access to SSRS*/ string userid = "UserId"; string password = "MyPassword"; string domain = "MyDomain"; string reportURL="http://ServerName/ReportServer?/ReportsFolder/ReportName&Parameter=UserName&rs:Command=Render&rs:Format=PDF"; NetworkCredential nwc = new NetworkCredential(userid, password, domain); WebClient client = new WebClient(); client.Credentials = nwc; Byte[] pageData = client.DownloadData(reportURL); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now); Response.BinaryWrite(pageData); Response.Flush(); Response.End(); //return View(); }