选项 1 - 为 .aspx 页面添加路由
从 MVC 4.0+ 开始,您可以使用 URL Routing with WebForms。这通过添加Map<b><i>Page</i></b>Route (注意页面部分)与 MVC 很好地混合,以将路由映射到物理文件。因此,将以下内容添加到您的RouteConfig.cs:
routes.MapPageRoute(
routeName: "ReportViewer",
routeUrl: "ReportViewer/{reportName}",
physicalFile: "~/ReportViewerPage.aspx"
);
当您导航到地址 ~/Reports/reportName 时,报告将运行。这可能会从控制器操作内部调用,可能使用一些用户输入的参数或 web.config 连接字符串。有很多ways to manage state in ASP.NET 和Pass Values to ASP.NET Web Forms Pages。一种选择是将信息存储在 Session 中并像这样在控制器中重定向:
HttpContext.Session[reportSetup.ReportName] = new ReportSetup() {ReportName = "ClientReport"}; //reportSetup;}
return RedirectToRoute("ReportViewer", new { reportName = reportSetup.ReportName});
然后,在 .aspx 页面中,您可以从 RouteData 值和会话中的任何设置参数中获取 reportName:
// get report name from route
string reportName = Page.RouteData.Values["reportName"].ToString();
// get model from session and clear
ReportSetup setup = (ReportSetup)HttpContext.Current.Session[reportName];
优点:
- 大部分路由似乎默认都可以,AJAX控件也可以正常工作,所以可以设置
AyncRendering=True
缺点:
选项 2 - 将 .ascx 嵌套在页面上的 PartialView 内
改编自How can I use a ReportViewer control with Razor?,只要继承自System.Web.Mvc.ViewUserControl,就可以在PartialViews中使用.ascx控件。
创建一个名为 ReportViewerControl.ascx 的新 Web 窗体用户控件,如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ReportViewerControl.ascx.cs" Inherits="MVCAppWithReportViewer.ReportViewerControl" %>
<%@ Register TagPrefix="rsweb" Namespace="Microsoft.Reporting.WebForms" Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>
<form id="form1" runat="server">
<rsweb:ReportViewer ID="ReportViewer" runat="server"
Height="100%" Width="100%"
SizeToReportContent="True" ProcessingMode="Remote"
AsyncRendering="False" />
<asp:ScriptManager ID="ScriptManager1" runat="server"
EnablePartialRendering="false" />
</form>
注意:必须设置AsyncRendering="False"和EnablePartialRendering="false"
在后面的代码中,您需要将继承类型从System.Web.UI.UserControl 替换为System.Web.Mvc.ViewUserControl。
在Page_Init 上,您需要将Context.Handler 设置为Page,以便正确注册事件。
所以ReportViewerControl.ascx.cs 应该是这样的:
public partial class ReportViewerControl : System.Web.Mvc.ViewUserControl
{
protected void Page_Init(object sender, EventArgs e)
{
// Required for report events to be handled properly.
Context.Handler = Page;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
/* ... report setup ... */
serverReport.Refresh();
}
}
}
为了呈现报告,将以下内容添加到您的控制器视图中:
@Html.Partial("ReportViewerControl", Model)
然后在 ReportViewerControl.ascx.cs Page_Load 事件中,您可以从 ViewUserControl.Model 属性中检索传入的模型,如下所示:
ReportSetup setup = (ReportSetup)Model;
优点:
- 可以构建到 master
_layout.cshtml 并在常规视图中使用
- 可以直接传模型
缺点: