【问题标题】:Setting up ReportViewer in Remote Processing Mode with AsyncRendering使用 AsyncRendering 在远程处理模式下设置 ReportViewer
【发布时间】:2013-03-11 17:28:10
【问题描述】:

我正在尝试在如下配置的 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 时相同的错误。

【问题讨论】:

  • 尝试关闭异步渲染。我见过的每个例子都没有使用它。有几个例子我用来在 mvc 中工作:stackoverflow.com/questions/3577118/…stackoverflow.com/questions/6144513/…
  • 对,但问题是,我希望它与异步一起工作。我可以让它同步工作,只是工具栏不起作用,我必须做很多工作才能导航多页报告。每一个都需要我重新加载页面。我想 - 某人 - 必须知道如何让它工作,为什么它还存在?
  • 我认为你会不走运,微软说它不支持 MVC:connect.microsoft.com/VisualStudio/feedback/details/541538/…
  • 这让我很伤心。谢谢你的帮助。我一直在寻找一个星期的答案,但我只是不知道要搜索什么,所以我最终找到了完全相同的东西:/

标签: asp.net-mvc-3 reportviewer


【解决方案1】:

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

【讨论】:

  • 啊!我有大部分,我只是把提交部分搞砸了。我会试一试,它可能对我目前进行导航的方式更好一些。 (我的导航目​​前是提交按钮,因为我必须自己制作。Ajax 新手)。非常感谢。
  • 再次查看提交调用,我缺少一个 function() 参数。
  • 好的,所以我遇到了一个我之前忘记的问题。我像上面一样加载它,它再次点击 Page_Load 并撤消我刚刚完成的所有内容(例如导航页面)。 IsPostBack 始终为假。有没有办法解决这个问题?
  • 页面加载时报告将始终为空。当用户导航到页面时,您是否希望始终拥有此负载?
  • 嗯,实际上我认为我的问题是某些东西(不确定是什么)没有再次执行。 (与我之前的说法相矛盾)。因此,我进行了 Ajax 调用,成功后,我将 ReportViewer 所在的 div 替换为新的,然后它尝试像正常的一样运行它的 page_load,但只完成了一半。不知道发生了什么。 (嗯,为了更清楚一点,page_load 已完全完成,但 ReportViewer 控件呈现过程之外的某些内容并未完成)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多