本帖最后由 Felix.Li 于 2025-1-13 18:08 编辑
今天给大家共享一下AR的所有和参数相关的传递场景,及报表控件在集成的时候,我们想传递参数,应该怎么使用。
首先先说一下传参有几种场景,我总结了一下。
1.参数用来获取报表。
1.1 通过报表id传递参数
1.2 通过header传参
2.参数给报表内部传递。
2.1 直接通过前端把参数传递给报表
2.2 通过后端把参数传递给报表
2.附3 在 LocateDataSource 中如何应用
首先先说第一大类
1.参数用来获取报表。
前提纪要,为什么要说参数用来获取报表呢。
说这个之前就得先知道,AR的web查看器,最基本默认的获取报表,是通过一个文件夹地址,获取文件夹下的报表。这种我们其实不需要处理任何东西。
但是还有一种是自定义获取报表,这种相当于我通过代码把报表对象返回,并且在返回过程中可以自定义写自己的别的逻辑。也就是我们在伴随报表查看的时候,需要把参数用来做别的业务或者区分用户等等,这个时候就需要依靠AR的自定义能力来实现。
那么先说前提,自定义返回报表需要怎么实现:
我们需要新定义一个类,这个类继承: IReportProvider
他有两个方法需要实现:
GetReport、GetReportDescriptor,第二个本身并不重要,第一个的返回结果就是一个报表stream流。
- public class reportProvider : IReportProvider
- {
- public Stream GetReport(string reportId)
- {
- return new MemoryStream(Encoding.UTF8.GetBytes(report.ToRdlString()));
- }
- public ReportDescriptor GetReportDescriptor(string reportId)
- {
- return new ReportDescriptor(GrapeCity.ActiveReports.Web.Viewer.ReportType.RdlXml);
- }
- }
复制代码 可以看到两个入参都是报表id,也就是前端会传报表名称,后端这个方法就会接收这个名称,这个在后续参数传递也会有作用。
并且很多自定义的实现,其实也是在GetReport中实现的,因为这里可以自定义报表返回,想实现自己的逻辑基本都在这里了。
而类实现好后,使用就如下:
- app.UseReportViewer(config =>
- {
- config.UseReportProvider(new reportProvider());
- });
复制代码
用这种,就不需要使用:
- config.UseFileStore(ResourcesRootDirectory);
复制代码
那么说完前提,我们就开始说参数具体应该怎么传递。
参数传递有两种方法:
1.1 通过报表id传递参数
1.2 通过header传参
1.1 通过报表id传递参数
第一种比较简单,就是我们前端页面传递报表名称的时候,利用报表名称+参数拼接,然后后端解析即可:
- let viewer = createViewer({
- locale: 'zh',
- element: '#ar-web-viewer',
- reportID: "***.rdlx;1;2;",
- settings: {
- zoomType: 'FitPage',
- }
- });
复制代码 可以看到,我们名称里面拼接了1;2,那么后端会在报表预览的时候执行GetReport(string reportId),而reportId就是"***.rdlx;1;2;",我们自己解析字符串即可。
1.2 通过header传参
那么除了这种利用报表名称传递参数外,还可以利用请求的header传递参数,然后后端去获取header的参数即可。
那么前端的传递需要改成:
- let viewer = createViewer({
- locale: 'zh',
- element: '#ar-web-viewer',
- reportID: "***.rdlx",
- reportService: {
- url: 'api/reporting',
- onRequest: function (init) {
- init.headers.paramter = 'aaa';
- }
- },
- settings: {
- zoomType: 'FitPage',
- }
- });
复制代码
后端利用IHttpContextAccessor 接收即可:
Startup中添加类 MvcContext:
- public class MvcContext
- {
- public static IHttpContextAccessor httpContextAccessor;
- public static HttpContext GetContext()
- {
- HttpContext context = httpContextAccessor.HttpContext;
- return context;
- }
- }
复制代码 ConfigureServices添加:
- services.AddHttpContextAccessor();
复制代码 Configure添加:
- public void Configure(IApplicationBuilder app, IHttpContextAccessor httpContext){
- MvcContext.httpContextAccessor = httpContext;
- }
复制代码 那么就可以利用:
- MvcContext.GetContext().Request.Headers["paramter"].ToString();
复制代码 获取header的参数了。
以上两个都是在
IReportProvider类里的GetReport去获取报表的参数。然后去处理自己的业务逻辑或者对返回的报表做处理。
那么说完第一种,就再看第二大类
2.参数给报表内部传递。
这种就比较直接了,因为给报表传递参数,其实一般无非就是用作过滤等,而这个也分为两个:
2.1.直接通过前端把参数传递给报表
2.2.通过后端把参数传递给报表
2.附3. 在 LocateDataSource 中如何应用
可以看到,参数传递其实第一第二就可以了,至于参数在报表里面如何使用,本章就不转述了,加了个附3,主要是有时候自定义运行时数据源有些客户不知道也可以传递参数,这里就附带一下。那么接下来就具体说一下参数的如何传递。
2.1 直接通过前端把参数传递给报表。
这种也是非常简单,前端有直接的对象接收参数:
- let viewer = createViewer({
- element: '#ar-web-viewer',
- reportParameters: [{name: "paramter1", values: ["js传参"]}]
- });
复制代码
2.2 通过后端把参数传递给报表
这种也是在getReport中,利用获取到的报表对象,直接改参数的默认值。方法如下:
- PageReport report = new PageReport();
- report.Report.ReportParameters[0].DefaultValue.Values.Add("后端赋值");
复制代码 那么以上基本就是AR涉及的所有外部参数传递了
2.附3
那最后也说了一下,参数使用也是有地方的,除了报表内部,就是前端假如传递了一个参数。后端运行时数据源需要使用,那么在什么地方呢:
- app.UseReportViewer(config =>
- {
- config.LocateDataSource = (arg) =>
- {
- Console.WriteLine("运行时数据源参数获取:" + arg.Parameters[0].Name);
- return null;
- };
- });
复制代码 这种就是一般前端传递参数给后端,然后后端根据参数的不同,给数据源赋值不同的数据,然后返回不同的dataTable即可。
也就是自定义运行时数据源的参数应用场景了。
以上就是分享的AR相关的参数使用的传递场景了,大家还有什么参数的使用场景呢,欢迎一起分享
|