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

C# 如何修复ReportViewer在ASP.NET MVC中向多个用户显示相同报告的问题?,c#,.net,reporting,C#,.net,Reporting,我使用ASP.NETMVC编写了一个系统,可以生成各种财务报告。每个报告都在它自己的控制器中,每个控制器都有自己的“报告”操作。该操作使用ViewBag中的报告呈现局部视图,并将该报告传递给前端的javascript,并将呈现的元素放入JQueryUI对话框中 一个用户可以运行资产负债表报表,然后另一个用户可以运行损益表报表,在第一个用户运行资产负债表报表之后,第二个用户看到的不是损益表,而是资产负债表 这是将报告作为JSON对象返回的代码 //Initialize report and ad

我使用ASP.NETMVC编写了一个系统,可以生成各种财务报告。每个报告都在它自己的控制器中,每个控制器都有自己的“报告”操作。该操作使用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>
@使用ReportViewerForMvc;
@Html.ReportViewer(ViewBag.ReportViewer作为Microsoft.Reporting.WebForms.ReportViewer)

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

在@Html.reportViewer()中使用部分视图,而不是在视图包中使用它,尝试将部分视图设置为“reportViewer”的强类型视图

然后转到返回该部分视图的代码,并在返回时将其设置为 返回Json(JsonResponse.Success(RenderRazorViewToString(“打印凭证”,reportViewer))

  • 确保您的操作没有要生成的
    OutputCache
    属性 确保服务器始终为每个请求或集合计算新报告 属性构造函数上的VaryByParam
  • 使用强类型模型,而不是
    ViewBag
  • 在每次调用时初始化
    ReportViewer
    的新对象,而不是使用单个静态对象
  • 在控制器操作上使用
    PartialView
    并将报告对象传递给PartialView,Razor引擎将使用模型处理部分视图,并生成HTML标记作为json调用的返回
  • 这里是控制器和视图的工作示例(我使用了Bootbox而不是JqueryUI)

    控制器: 用于加载报表视图的JavaScript方法
    函数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>