请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Felix.Li Wyn认证

超级版主

110

主题

3000

帖子

5672

积分

超级版主

Rank: 8Rank: 8

积分
5672

Wyn高级认证Wyn认证

Felix.Li Wyn认证
超级版主   /  发表于:2025-1-10 18:24  /   查看:11  /  回复:0
本帖最后由 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流。
  1. public class reportProvider : IReportProvider
  2. {
  3.     public Stream GetReport(string reportId)
  4.     {
  5.         return new MemoryStream(Encoding.UTF8.GetBytes(report.ToRdlString()));
  6.     }

  7.     public ReportDescriptor GetReportDescriptor(string reportId)
  8.     {
  9.         return new ReportDescriptor(GrapeCity.ActiveReports.Web.Viewer.ReportType.RdlXml);
  10.     }
  11. }
复制代码
可以看到两个入参都是报表id,也就是前端会传报表名称,后端这个方法就会接收这个名称,这个在后续参数传递也会有作用。
并且很多自定义的实现,其实也是在GetReport中实现的,因为这里可以自定义报表返回,想实现自己的逻辑基本都在这里了。

而类实现好后,使用就如下:
  1. app.UseReportViewer(config =>
  2. {
  3.     config.UseReportProvider(new reportProvider());
  4. });
复制代码

用这种,就不需要使用:
  1. config.UseFileStore(ResourcesRootDirectory);
复制代码

那么说完前提,我们就开始说参数具体应该怎么传递。
参数传递有两种方法:
1.1 通过报表id传递参数
1.2 通过header传参


1.1 通过报表id传递参数
第一种比较简单,就是我们前端页面传递报表名称的时候,利用报表名称+参数拼接,然后后端解析即可:
  1. let viewer = createViewer({
  2.         locale: 'zh',
  3.         element: '#ar-web-viewer',
  4.         reportID: "***.rdlx;1;2;",
  5.         settings: {
  6.             zoomType: 'FitPage',
  7.         }
  8.     });
复制代码
可以看到,我们名称里面拼接了1;2,那么后端会在报表预览的时候执行GetReport(string reportId),而reportId就是"***.rdlx;1;2;",我们自己解析字符串即可。

1.2 通过header传参
那么除了这种利用报表名称传递参数外,还可以利用请求的header传递参数,然后后端去获取header的参数即可。
那么前端的传递需要改成:
  1. let viewer = createViewer({
  2.         locale: 'zh',
  3.         element: '#ar-web-viewer',
  4.         reportID: "***.rdlx",
  5.         reportService: {
  6.             url: 'api/reporting',
  7.             onRequest: function (init) {
  8.                 init.headers.paramter = 'aaa';
  9.             }
  10.         },
  11.         settings: {
  12.             zoomType: 'FitPage',
  13.         }
  14.     });
复制代码

后端利用IHttpContextAccessor 接收即可:
Startup中添加类 MvcContext:
  1. public class MvcContext
  2. {
  3.   public static IHttpContextAccessor httpContextAccessor;
  4.   public static HttpContext GetContext()
  5.   {
  6.     HttpContext context = httpContextAccessor.HttpContext;
  7.     return context;
  8.   }
  9. }
复制代码
ConfigureServices添加:
  1. services.AddHttpContextAccessor();
复制代码
Configure添加:
  1. public void Configure(IApplicationBuilder app, IHttpContextAccessor httpContext){
  2.      MvcContext.httpContextAccessor = httpContext;
  3. }
复制代码
那么就可以利用:
  1. MvcContext.GetContext().Request.Headers["paramter"].ToString();
复制代码
获取header的参数了。

以上两个都是在
IReportProvider类里的GetReport去获取报表的参数。然后去处理自己的业务逻辑或者对返回的报表做处理。

那么说完第一种,就再看第二大类
2.参数给报表内部传递。

这种就比较直接了,因为给报表传递参数,其实一般无非就是用作过滤等,而这个也分为两个:
2.1.直接通过前端把参数传递给报表
2.2.通过后端把参数传递给报表

2.附3. 在 LocateDataSource 中如何应用

可以看到,参数传递其实第一第二就可以了,至于参数在报表里面如何使用,本章就不转述了,加了个附3,主要是有时候自定义运行时数据源有些客户不知道也可以传递参数,这里就附带一下。那么接下来就具体说一下参数的如何传递。

2.1 直接通过前端把参数传递给报表。
这种也是非常简单,前端有直接的对象接收参数:
  1. let viewer = createViewer({
  2.     element: '#ar-web-viewer',
  3.     reportParameters: [{name: "paramter1", values: ["js传参"]}]
  4. });
复制代码

2.2 通过后端把参数传递给报表
这种也是在getReport中,利用获取到的报表对象,直接改参数的默认值。方法如下:
  1. PageReport report = new PageReport();
  2. report.Report.ReportParameters[0].DefaultValue.Values.Add("后端赋值");
复制代码
那么以上基本就是AR涉及的所有外部参数传递了

2.附3
那最后也说了一下,参数使用也是有地方的,除了报表内部,就是前端假如传递了一个参数。后端运行时数据源需要使用,那么在什么地方呢:
  1. app.UseReportViewer(config =>
  2. {
  3.     config.LocateDataSource = (arg) =>
  4.     {
  5.         Console.WriteLine("运行时数据源参数获取:" + arg.Parameters[0].Name);
  6.         return null;
  7.     };
  8. });
复制代码
这种就是一般前端传递参数给后端,然后后端根据参数的不同,给数据源赋值不同的数据,然后返回不同的dataTable即可。
也就是自定义运行时数据源的参数应用场景了。

以上就是分享的AR相关的参数使用的传递场景了,大家还有什么参数的使用场景呢,欢迎一起分享

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部