使用AsyncRendering在远程处理模式下设置ReportViewer

时间:2013-03-11 17:28:10

标签: asp.net-mvc-3 reportviewer

我正在尝试在MVC3环境中设置ReportViewer,配置如下,

<form id="Form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <rsweb:ReportViewer ID="ReportViewer" runat="server" Width="652px" AsyncRendering="true" PageCountMode="Actual" ProcessingMode="Remote" SizeToReportContent="true">
        <ServerReport ReportServerUrl="http://NMBSC-INTERN02/reportserver" ReportPath="/ReportProject/TestReport3" />
    </rsweb:ReportViewer>
</form>

问题是我在页面上收到错误(来自chrome调试工具)

Uncaught Sys.WebForms.PageRequestManagerParserErrorException: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. ScriptResource.axd:237
Error$create ScriptResource.axd:237
Sys$WebForms$PageRequestManager$_createPageRequestManagerParserError ScriptResource.axd:649
Sys$WebForms$PageRequestManager$_parseDelta ScriptResource.axd:1410
Sys$WebForms$PageRequestManager$_onFormSubmitCompleted ScriptResource.axd:1289
(anonymous function) ScriptResource.axd:47
(anonymous function) ScriptResource.axd:3484
Sys$Net$WebRequest$completed ScriptResource.axd:6364
Sys$Net$XMLHttpExecutor._onReadyStateChange ScriptResource.axd:5984

我在错误方面看了很多,但它总是指删除UpdatePanel,但我没有。我确实在iFrame中有完整的局部视图(上图)但我得到的错误是否在IFrame中。其他解决方案谈论Server.Transfer和Response.Write调用,但这不是我的代码(它由ReportViewer控件生成)我猜我只是在配置中做错了。

我是否缺少让远程处理模式起作用的东西?我可以在Local中执行此操作,但如果我可以使远程处理模式工作,那么它似乎最适合我正在进行的项目。

注意

我想值得注意的是,如果我关闭异步模式,报告将正确加载。问题是工具栏上的导航按钮(下一个,第一个,最后一个,前一个)不起作用,并且笨拙地抛出与打开AsyncRendering时相同的错误。

1 个答案:

答案 0 :(得分:2)

默认情况下,ReportViewer不能与MVC一起使用,因为它是服务器端控件,因此我必须调整该过程。

它包含2个视图,一个包含输入的父视图,以便用户可以更改报表参数以及在父级内呈现的部分视图,即实际报表。每当用户提交其当前参数时,我们使用ajax调用从控制器检索部分并将结果视图放在页面上,刷新报告。

首先,父母的行动:

public ActionResult MyReport()
{
    return View();
}

接下来是父母的观点:

<div>
    <div>

      <!-- input elements go here -->
      <input type="button" value='Update'/>
    </div>
    <div id="ReportPartial"></div>
</div>

<script type="text\javascript">
    $(document).ready(function(){
        $("input[type=button]").click(function(e){
            $.get("/Report/MyReportPartial", "put data from the input elements here", function(serverData){
                $("#ReportPartial").html(serverData);
            });
        });
    });

</script>

现在,我们设置一个返回局部视图的控制器动作。控制器操作具有与报告相同的参数:

public ActionResult MyReportPartial(report parameters go here)
{

    //set ViewBag properties here to the report parameters.
    //Normally, I do not advise using the ViewBag, but I used it in this instance to
    //get it working in the aspx page.

    return PartialView("ReportViewPartial", null);
}

最后,partial是一个aspx页面:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ 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">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer1" runat="server" 
ProcessingMode="Remote" SizeToReportContent="True" ShowBackButton="False" 
ShowFindControls="False" ShowPageNavigationControls="False" 
ShowZoomControl="False" AsyncRendering="False" ShowRefreshButton="False" ShowExportControls="False" Height="500" Width="500">
</rsweb:ReportViewer>
</form>

<script runat="server">
void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;
    ReportViewer1.ProcessingMode = ProcessingMode.Remote;
    ReportViewer1.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServerUrl"]);
    ReportViewer1.ServerReport.ReportPath = ConfigurationManager.AppSettings["ReportPath"];
    var rptParameters = new List<ReportParameter>
                            {
                                //Add report parameters here from the ViewBag
                            };

    ReportViewer1.ServerReport.SetParameters(rptParameters);
    ReportViewer1.ServerReport.Refresh();
}
</script>
<script type="text/javascript">
    //the report is hidden when loaded. Using the following jQuery to show it.
    $(document).ready(function () {
        var div = $("#ReportPartial").find("div[id*='_ReportControl']");
        div.show();
        div.find("div:first").show();
    });
</script>

现在它的设置是这样的,每当用户提交时,我们ajax加载带有报告的aspx页面,基本上刷新它。您丢失了报表控件的某些功能,但它适用于客户端所需的功能。