如何修复 ReportViewer 在 ASP.NET MVC 中向多个用户显示同一报表的问题?

我使用 ASP.NET MVC编写了一个系统,可以生成各种财务报告。每个报告都在其自己的控制器中,每个控制器都有自己的“报告”操作。该操作 在 ViewBag 中呈现一个包含报表的部分视图,该视图将报表传递给前端的 javascript,并将呈现的元素放在 JQueryUI 对话框中。


用户可以运行资产负债表报表,然后另一个用户可以运行损益表报表,在第一个用户运行资产负债表报表之后,第二个用户看到的不是损益表,而是资产负债表。


这是将报表作为 JSON 对象返回的代码


 //Initialize report and add datasources etc.

 reportViewer.LocalReport.Refresh();

 ViewBag.ReportViewer = reportViewer;


 return Json(JsonResponse.Success(RenderRazorViewToString("PrintVoucher", null)));


这是部分视图


@using ReportViewerForMvc;



<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">

    @Html.ReportViewer(ViewBag.ReportViewer as Microsoft.Reporting.WebForms.ReportViewer)

</div>

任何建议或指导将不胜感激!


紫衣仙女
浏览 129回答 3
3回答

海绵宝宝撒

我们遇到了同样的问题,它似乎与ReportViewerForMvc中的并发错误有关。偶然发现了这个旧的github链接,其中包含信息和建议的修复程序。希望这有帮助。https://github.com/nrifath2009/ReportViewerForMvc/pull/1

MMTTMM

确保 Action 没有属性,以确保服务器始终为每个请求计算新报告或 Set on 属性构造函数OutputCacheVaryByParam使用强类型模型而不是ViewBag在每次调用时初始化 的新对象,而不是使用单个静态对象。ReportViewer在控制器上使用操作并将报表对象传递到 PartialView,Razor 引擎将使用模型处理 Partial View,并生成 HTML 标记作为 json 调用的返回。PartialView这是控制器和视图的工作示例(我使用Bootbox而不是JqueryUI)控制器:[HttpPost, ValidateAntiForgeryToken]public PartialViewResult Report(/*Pass Optional Parameters If Required*/){&nbsp; &nbsp; var reportViewer = new ReportViewer();&nbsp; &nbsp; //reportViewerInitialization&nbsp; &nbsp; return PartialView("PrintVoucher", reportViewer);}用于加载报表视图的 JavaScript 方法function showReport(reportControllerName){&nbsp; &nbsp; var dialog = bootbox.dialog({&nbsp; &nbsp; &nbsp; &nbsp; message: '<p><i class="fa fa-spin fa-spinner"></i> Loading...</p>'&nbsp; &nbsp; });&nbsp; &nbsp; $.ajax({&nbsp; &nbsp; &nbsp; &nbsp; type: "POST",&nbsp; &nbsp; &nbsp; &nbsp; url: '/'+ reportControllerName +'/Report/',&nbsp; &nbsp; &nbsp; &nbsp; data: {/*DataPassed To The Report Action*/},&nbsp; &nbsp; &nbsp; &nbsp; success: function (data) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //data Field will contain an Html markup resulted from razor engine process for PrintVoucher PartialView&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dialog.find('.bootbox-body').html(data);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });}PrintVoucher.cshtml@using ReportViewerForMvc;<div class="container">&nbsp; &nbsp; <div class="row">&nbsp; &nbsp; &nbsp; &nbsp; <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Html.ReportViewer(Model as Microsoft.Reporting.WebForms.ReportViewer)&nbsp; &nbsp; &nbsp; &nbsp; </div>&nbsp; &nbsp; </div></div>

慕妹3242003

尝试在@Html.ReportViewer() 而不是视图包中,使部分视图成为“reportViewer”的强类型视图。之后转到返回该部分视图的代码,并在返回集时将其作为返回Json(JsonResponse.Success(RenderRazorViewToString(“PrintVoucher”, reportViewer)));
打开App,查看更多内容
随时随地看视频慕课网APP