C# 如何修复ReportViewer在ASP.NET MVC中向多个用户显示相同报告的问题?
我使用ASP.NETMVC编写了一个系统,可以生成各种财务报告。每个报告都在它自己的控制器中,每个控制器都有自己的“报告”操作。该操作使用ViewBag中的报告呈现局部视图,并将该报告传递给前端的javascript,并将呈现的元素放入JQueryUI对话框中 一个用户可以运行资产负债表报表,然后另一个用户可以运行损益表报表,在第一个用户运行资产负债表报表之后,第二个用户看到的不是损益表,而是资产负债表 这是将报告作为JSON对象返回的代码C# 如何修复ReportViewer在ASP.NET MVC中向多个用户显示相同报告的问题?,c#,.net,reporting,C#,.net,Reporting,我使用ASP.NETMVC编写了一个系统,可以生成各种财务报告。每个报告都在它自己的控制器中,每个控制器都有自己的“报告”操作。该操作使用ViewBag中的报告呈现局部视图,并将该报告传递给前端的javascript,并将呈现的元素放入JQueryUI对话框中 一个用户可以运行资产负债表报表,然后另一个用户可以运行损益表报表,在第一个用户运行资产负债表报表之后,第二个用户看到的不是损益表,而是资产负债表 这是将报告作为JSON对象返回的代码 //Initialize report and ad
//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>
@使用ReportViewerForMvc;
@Html.ReportViewer(ViewBag.ReportViewer作为Microsoft.Reporting.WebForms.ReportViewer)
任何建议或指导将不胜感激 在@Html.reportViewer()中使用部分视图,而不是在视图包中使用它,尝试将部分视图设置为“reportViewer”的强类型视图 然后转到返回该部分视图的代码,并在返回时将其设置为 返回Json(JsonResponse.Success(RenderRazorViewToString(“打印凭证”,reportViewer))强>
OutputCache
属性
确保服务器始终为每个请求或集合计算新报告
属性构造函数上的VaryByParamViewBag
ReportViewer
的新对象,而不是使用单个静态对象PartialView
并将报告对象传递给PartialView,Razor引擎将使用模型处理部分视图,并生成HTML标记作为json调用的返回函数showReport(reportControllerName)
{
var dialog=bootbox.dialog({
消息:“正在加载…”
});
$.ajax({
类型:“POST”,
url:“/”+reportControllerName+“/Report/”,
数据:{/*传递给报表操作的数据*/},
成功:功能(数据){
//数据字段将包含一个Html标记,该标记由PrintVoucher PartialView的razor引擎进程生成
dialog.find('.bootbox body').html(数据);
}
});
}
PrintVoucher.cshtml
@使用ReportViewerForMvc;
@ReportViewer(模型为Microsoft.Reporting.WebForms.ReportViewer)
我们遇到了相同的问题,它似乎与ReportViewPerformVC中的并发错误有关。偶然发现了这个旧的github链接,其中包含信息和建议的修复。希望这有帮助
我们目前面临着类似的问题。当并发用户看到为其他用户准备的报告时,它就会成为一种安全漏洞。我们已经尝试过这个解决方案,但没有成功。这也没有解决我们的问题。我们使用的是强类型模型,而不是ViewBag。这个问题解决了吗?我们正在经历同样的事情,并且不断遇到障碍。谢谢你的回答!这就是问题所在。静态类使用了错误的reportviewer。我们选择使用强类型模型而不是ViewBag,但是唯一的Guid ID流基本上是相同的。
[HttpPost, ValidateAntiForgeryToken]
public PartialViewResult Report(/*Pass Optional Parameters If Required*/)
{
var reportViewer = new ReportViewer();
//reportViewerInitialization
return PartialView("PrintVoucher", reportViewer);
}
function showReport(reportControllerName)
{
var dialog = bootbox.dialog({
message: '<p><i class="fa fa-spin fa-spinner"></i> Loading...</p>'
});
$.ajax({
type: "POST",
url: '/'+ reportControllerName +'/Report/',
data: {/*DataPassed To The Report Action*/},
success: function (data) {
//data Field will contain an Html markup resulted from razor engine process for PrintVoucher PartialView
dialog.find('.bootbox-body').html(data);
}
});
}
@using ReportViewerForMvc;
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">
@Html.ReportViewer(Model as Microsoft.Reporting.WebForms.ReportViewer)
</div>
</div>
</div>