我正在尝试在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时相同的错误。
答案 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页面,基本上刷新它。您丢失了报表控件的某些功能,但它适用于客户端所需的功能。