KearneyKang 发表于 2020-1-20 16:06:23

JSviewer如何在Startup的方法里获取页面传输的值,进行数据筛选

使用JSviewe进行报表展示的时候,经常为了安全性的考虑和前后端分离的考虑,会在使用动态数据源的绑定。使用动态数据源的绑定很重要一点就是如何进行数据的筛选也就是如何在Startup方法里获取页面的传输进来的参数值。这个办法的实现有两种办法第一种是使用参数报表,然后再在Startup这个类文件中使用这句代码来实现: var name = args.Parameters.Value.ToString(); //获取报表参数    具体的你可以参考这个博客来详细了解:https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=57898&extra=page%3D2 现在来详细说说第二种实现办法:这个办法其实跟H5的方法类似都是通过页面端的:reportID来进行一个值的传输 简单的点来说,就是通过 reportID:来进行参数值和报表名称的传递,然后在Startup方法中进行是要Split函数进行一个分割来实现参数和报表名称的分割这样来达到最后想要实现的效果:通过页面端传入的值进行一个数据的筛选。 具体实现如下:前端代码:<script type="text/javascript">
    var viewer = GrapeCity.ActiveReports.JSViewer.create({
      element: '#viewerContainer',
      id: 'SalesDetail.rdlx' + ';' + $("#TextBox1").val()+';' + $("#TextBox2").val()//报表名称和参数的传递
      availableExports: ['Xml', 'Pdf'],
      reportService: {}
      
    });
</script>
后端代码:
使用UseCustomStore的方法进行报表名称和参数的获取和分割public class Startup1
    {
      public static string EmbeddedReportsPrefix = "JSdatasource";
      string ReportName = "";
      public object GetReport(string P)//获取报表名称和报表参数,进行一个对应的报表名称和参数的分割
      {
            string reportName = P.Split(';');//报表名称;
            string parameter1 = P.Split(';');//参数1,这样就可以根据参数值进行数据的筛选了;
            string parameter2 = P.Split(';');//参数2;
            PageReport rep=new PageReport();
            
            string path = System.Web.Hosting.HostingEnvironment.MapPath("~/");
            rep.Load(new FileInfo(@"" + path + "Reports/" + reportName));
            return rep.Report;
      }
      
      public void Configuration(IAppBuilder app)
      {
            app.UseReporting(settings =>
            {

                settings.UseCompression = true;
                settings.UseCustomStore(GetReport);//使用UseCustomStore来自定义一些需要的值
                settings.LocateDataSource = args =>
                {
                  DataTable dt = new DataTable();
                  string name = ReportName;
                  if (args.DataSet.Query.DataSourceName == "DataSource1")
                  {
                        string a = args.Report.Name.ToString();   //get Report name
                        if (args.DataSet.Name == "DataSet2")
                        {
                            name = args.Parameters.Value.ToString();
                            dt.Columns.Add("产品编号");
                            dt.Columns.Add("产品名称");
                            dt.Columns.Add("单价");
                            dt.Columns.Add("库存量");
                            dt.Columns.Add("产地");
                            dt.Rows.Add("A001", "苹果", 10, 300, "中国");
                            dt.Rows.Add("A002", "葡萄", 20, 200, "中国");
                            dt.Rows.Add("A003", "香蕉", 30, 400, "中国");
                            dt.Rows.Add("A004", "甘蔗", 10, 300, "中国");
                            dt.Rows.Add("A005", "荔枝", 20, 200, "中国");
                            dt.Rows.Add("A006", "芒果", 30, 400, "中国");
                            dt.Rows.Add("A007", "猕猴桃", 110, 300, "中国");
                            dt.Rows.Add("A008", "柠檬", 210, 200, "中国");
                            dt.Rows.Add("A009", "栗子", 320, 400, "中国");
                            dt.Rows.Add("A010", "火龙果", 100, 300, "中国");
                            dt.Rows.Add("A011", "青芒", 250, 200, "中国");
                            dt.Rows.Add("A012", "巴旦木", 320, 200, "中国");
                            dt.Rows.Add("A013", "土豆", 380, 400, "中国");
                            dt.Rows.Add("A014", "苹果", 110, 300, "中国");
                            dt.Rows.Add("A015", "葡萄", 420, 200, "中国");
                            dt.Rows.Add("A016", "香蕉", 530, 400, "中国");
                            dt.Rows.Add("A017", "土豆", 380, 400, "中国");
                            dt.Rows.Add("A018", "苹果", 110, 300, "中国");
                            dt.Rows.Add("A019", "葡萄", 420, 200, "中国");
                            dt.Rows.Add("A020", "香蕉", 530, 400, "中国");
                            dt.Rows.Add("A021", "苹果", 10, 300, "中国");
                            dt.Rows.Add("A022", "葡萄", 20, 200, "中国");
                            dt.Rows.Add("A023", "香蕉", 30, 400, "中国");
                            dt.Rows.Add("A024", "甘蔗", 10, 300, "中国");
                            dt.Rows.Add("A025", "荔枝", 20, 200, "中国");
                            dt.Rows.Add("A026", "芒果", 30, 400, "中国");
                        }
                  }
                  return dt;
                };


            });

      }


    }




kgxk 发表于 2021-9-22 08:57:03

可以不在Startup文件中实现动态数据绑定吗,希望实在控制器中:(

qcsoft 发表于 2020-6-19 18:48:06

LocateDataSource没被调用会是什么原因呢?

KearneyKang 发表于 2020-6-22 18:16:20

已经回复了,这是你同时使用了这两个方法,然后不知道是具体执行两个方法导致的

gxfmmm 发表于 2020-7-13 18:40:15

假设动态数据源的字段都不一样。就是按请求参数 多个数据源 切换的GETreport怎么写

gxfmmm 发表于 2020-7-13 18:50:10

gxfmmm 发表于 2020-7-13 18:40
假设动态数据源的字段都不一样。就是按请求参数 多个数据源 切换的GETreport怎么写

我需要实现的是前台JSVEIW传来一个参数,读取到一个结果集,然后再前端展现。 结果集的字段不一样。也存在N个结果集可能,一直可能在新加(按ID读取数据库配置的SQL作为结果集)

KearneyKang 发表于 2020-7-14 17:56:50

你好,使用JSviewer是可以通过前端传递参数值在Startup.CS的方法里进行数据 筛选的,有两种办法第一种就是上面说的办法,还有一种是使用参数报表,在后端获取 参数的值进行筛选
但是具体的操作还是要详细根据你的当前业务场景进行实现

杭州昱恒科技 发表于 2022-4-22 13:36:14

kgxk 发表于 2021-9-22 08:57
可以不在Startup文件中实现动态数据绑定吗,希望实在控制器中

对啊,怎么能在startup里去做报表路由呢

Bella.Yuan 发表于 2022-4-22 18:16:07

杭州昱恒科技 发表于 2022-4-22 13:36
对啊,怎么能在startup里去做报表路由呢

您好,Startup相当于一个中间层,目前只能这样
页: [1]
查看完整版本: JSviewer如何在Startup的方法里获取页面传输的值,进行数据筛选