Razor视图下使用iframe加载RDLC报表

MVC视图下默认是不支持服务器端控件的,所以,为了能够通过report viewer控件加载报表,需要在MVC视图添加嵌入的页面。

起初在stackoverflow上找到一个解决方案,见这里。不过这里的解决方案的一个最大缺陷是,不支持页面导航,也就是只能显示报表的第一页。

因为,原作者也说了,MVC页面下不支持导航控件的post back,也就无法正常工作。

看到评论里有人说iframe才可以解决多页报表的问题,于是试了试,最终成功搞定。

1.在项目中新建立WebForm1.aspx,并修改Global.asax.cs使得aspx页面可以直接访问。

routes.IgnoreRoute("WebForms/{weform}");

2.在需要加载报表的试图页面添加iframe定义,并添加对WebForm1.aspx的引用。

<iframe id="ifr" src="../WebForms/WebForm1.aspx" width="900px" height="700px" frameborder=0>
</iframe>

3.WebForm1.aspx中添加report viewer控件,并引用设计的报表。

<form id="Form1" runat="server">
  <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
  <asp:UpdatePanel ID="uid"  runat="server">
    <ContentTemplate>
      <rsweb:ReportViewer ID="ReportViewer1" runat="server" AsyncRendering="false"
        Height="800px" Width="900px" ShowFindControls="False"
        ShowBackButton="False" PageCountMode="Actual"></rsweb:ReportViewer>
    </ContentTemplate>  </asp:UpdatePanel>
</form>

4.后台代码的Page_Load方法中,添加数据源。

ReportViewer1.LocalReport.ReportPath = Server.MapPath("~/Reports/Report1.rdlc");
ReportDataSource reportDataSource = new ReportDataSource("DataSet1", yourdatasource);
ReportViewer1.LocalReport.DataSources.Add(reportDataSource);
ReportViewer1.LocalReport.Refresh();

5.现在报表就可以显示了,不过为了让报表可以接收页面的参数,需要添加一点代码。在视图页面的刷新方法中,根据不同的过滤条件,为iframe指定不同的url地址。

function reloadData() {
        var fil = filterfield.value;
        var urlstr = ifr.location.href + ‘?filter=‘ + fil;
        ifr.window.location.href=urlstr;
    }

6.在WebForm1.aspx的后台代码中,获取url参数。

string filter= Request.QueryString["filter"];

7.将参数应用到数据查询中,这样就可以通过页面查询更新报表的显示数据了。

时间: 2024-07-29 21:09:35

Razor视图下使用iframe加载RDLC报表的相关文章

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈:

javscript 实现iframe加载内容页出现LOADING效果

<div id="load" align="center"> <img src="http://sc.cnwebshow.com/upimg/allimg/070707/01294420.gif" /> loading </div> <!-- 首先放一个div,用做loading效果 --> <iframe id="demo" src="http://www.**

转:iframe加载的子页面里面获取父级元素窗口以及元素的高度

iframe里的js要操作父级窗口的dom,必须搞懂几个对象: parent是父窗口(如果窗口是顶级窗口,那么parent==self==top) top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe) self是当前窗口(等价window) 父级页面:index.html <!doctype html> <html> <head> <meta charset="utf-8"> <title>父窗口<

在tomcat下使用jni加载本地库的问题总结——处理UnsatisfiedLinkError错误

最近想使用ICTCLAS分词系统,需要在myeclipse中加载dll(本地库),查阅资料使用jni,ICTCLAS官方也提供了很全面的加载方法,虽然在run as java application下运行没有问题,但是在tomcat下报UnsatisfiedLinkError的错误,错误来自System.loadLibrary("ICTCLAS50"),是jni加载本地库的语句. 之前其实为了省事将dll放在根目录下,显然也不符合tomcat的要求,重新移动到webapps下,想将IC

Android下将图片加载到内存中

Android的系统的标准默认每个应用程序分配的内存是16M.所以来说是非常宝贵的,在创建应用的时候要尽可能的去节省内存,但是在加载一些大的文件的时候,比如图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当加载到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,下面我就来带大家创建一个用来图片缩放的应用: 应用效果图如下: 核心代码的实现: package com.examp.loadp

ie6 下图片预加载的问题

1.昨天帮同事看了一个问题 就是 ie6 下 图片预加载图片显示不出来 代码如下 var image = new Image(); image.src = "xx.jpg"; image.onload = function(){ xxxxx } 这样写的问题是 图片缓存的时间 把onload 事件错过了 所以修改一下 var image = new Image(); image.onload = function(){ xxxxx } image.src = "xx.jpg&

浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及其他的细节问题.而除了defer和async特性,动态脚本和Ajax脚本注入也是两种常用的创建无阻塞脚本的方法.总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机还是有一定差异,今天我们再来探讨一下通过动态脚本技术和Ajax注入的脚本在这些方

MVC中在一个视图中,怎么加载另外一个视图?

在RazorView.cshtml视图: <!--在视图中调用无返回值的方法,视图中调用无返回值的方法,要加上大括号--> <!--在一个视图中,直接加载另外一个视图--> @{ Html.RenderPartial("LoadViewBySelf");} 去加载LoadViewBySelf.cshtml视图: @{ ViewBag.Title = "LoadViewBySelf"; } <h2>LoadViewBySelf<

判断iframe加载完成、用于当ifame加载完成时执行一些操作

window.frames["iframec"].addEventListener( "load", function(){ window.frames["iframec"].setFormValue(obj);//iframe加载完成时的操作 }); IE iframe.attachEvent("onreadystatechange", function(){ //此事件在内容没有被载入时候也会被触发,所以我们要判断状态 /