为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
紫衣仙女 2022-08-20 16:02:43
我使用 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>任何建议或指导将不胜感激!
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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

https://github.com/nrifath2009/ReportViewerForMvc/pull/1


查看完整回答
反对 回复 2022-08-20
?
MMTTMM

TA贡献1869条经验 获得超4个赞

  1. 确保 Action 没有属性,以确保服务器始终为每个请求计算新报告或 Set on 属性构造函数OutputCacheVaryByParam

  2. 使用强类型模型而不是ViewBag

  3. 在每次调用时初始化 的新对象,而不是使用单个静态对象。ReportViewer

  4. 在控制器上使用操作并将报表对象传递到 PartialView,Razor 引擎将使用模型处理 Partial View,并生成 HTML 标记作为 json 调用的返回。PartialView

这是控制器和视图的工作示例(我使用Bootbox而不是JqueryUI)

控制器:

[HttpPost, ValidateAntiForgeryToken]

public PartialViewResult Report(/*Pass Optional Parameters If Required*/)

{

    var reportViewer = new ReportViewer();

    //reportViewerInitialization

    return PartialView("PrintVoucher", reportViewer);

}

用于加载报表视图的 JavaScript 方法

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);

        }

    });

}

PrintVoucher.cshtml

@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>


查看完整回答
反对 回复 2022-08-20
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

尝试在@Html.ReportViewer() 而不是视图包中,使部分视图成为“reportViewer”的强类型视图。

之后转到返回该部分视图的代码,并在返回集时将其作为返回Json(JsonResponse.Success(RenderRazorViewToString(“PrintVoucher”, reportViewer)));


查看完整回答
反对 回复 2022-08-20
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信