MVC项目中渲染RDLC报表时出现视图派生错误该如何解决
问题根因
这个报错的核心原因是ASP.NET MVC框架的视图引擎要求Views目录下的所有ASPX视图必须继承System.Web.Mvc.ViewPage或其泛型版本ViewPage<TModel>,你当前的报表页面使用了传统WebForm的System.Web.UI.Page作为基类,不符合MVC视图的继承规则。
解决方案
以下两种方案二选一即可:
方案1:修改页面继承规则(适合要放在MVC视图体系下使用的场景)
- 打开你的
ReportViwerASPX.aspx文件,修改顶部的Page指令,将Inherits属性的值替换为MVC的视图基类:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
- 如果你的页面有后置代码文件
ReportViwerASPX.aspx.cs,同步修改后置代码的类继承关系:
public partial class ReportViwerASPX : System.Web.Mvc.ViewPage { // 你的原有代码,包括Page_Load逻辑都可以保留 }
- 如果你需要绑定强类型模型,将基类替换为泛型版本
System.Web.Mvc.ViewPage<你的模型类名>即可。
方案2:独立托管WebForm报表页面(更推荐,避免MVC和WebForm控件的兼容问题)
ReportViewer是WebForm原生控件,和MVC视图体系本身存在一定兼容问题,更推荐单独托管:
- 将你写了报表逻辑的
report.aspx页面移动到站点根目录下独立的文件夹(比如/WebFormPages),不要放在Views目录下,MVC不会对非Views目录的ASPX文件做继承校验 Views目录默认有访问权限限制,放在独立目录的报表页面可以正常被iframe加载访问- 在需要展示报表的MVC视图中,用iframe嵌入该报表页面的访问地址即可:
<iframe src="/WebFormPages/report.aspx" width="100%" height="800" frameborder="0"></iframe>
- 该方案下你原有
Page_Load中的RDLC绑定逻辑不需要做任何修改即可正常运行。
补充说明
如果你不需要网页端交互预览,也可以在MVC控制器中直接读取RDLC配置、渲染为PDF/Excel等格式的文件流返回给前端下载,完全避开WebForm控件的兼容问题。
内容的提问来源于stack exchange,提问作者mr Ahmed
相关产品推荐
相关产品推荐

