1

我正在尝试在配置如下的 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 控件生成)我猜我只是在配置中做错了。

让远程处理模式工作我缺少什么吗?我可以在本地执行此操作,但如果我可以让远程处理模式工作,它似乎最适合我目前正在从事的项目。

笔记

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

4

1 回答 1

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);
}

最后,部分是一个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 页面,本质上是刷新它。您失去了报告控件的一些功能,但它可以满足客户的需求。

于 2013-03-11T20:04:56.777 回答