【问题标题】:how can I pass parameters to the reportSource that on the web api service如何将参数传递给 web api 服务上的 reportSource
【发布时间】:2014-07-20 06:22:56
【问题描述】:

报告:报告库

RepoerViewer:Html5

ReportService:Web API

在 Web api 服务中,dataSource 带来了 32,000 行数据。但报告中只使用了 10 行数据。这样,报告很慢。如何将参数传递给 web api 服务?

报告查看器:

<div id="reportViewer1" class="k-widget">
    loading...
</div>
<script type="text/javascript">
    $("#reportViewer1")
        .telerik_ReportViewer({
            serviceUrl: "http://localhost:2404/api/StokPaketList/",
            templateUrl: '../ReportViewer/templates/telerikReportViewerTemplate.html',
            reportSource: {
                report: "BeeSp.ReportLibrary.Stok.RprStokPaket, BeeSp.ReportLibrary",
                parameters: {
                    CultureID: "en"
                }
            }
        });
</script>

报告 Web Api 服务:

class CustomReportResolverWithFallBack : IReportResolver
{
    readonly IReportResolver _parentResolver; private IStokPaketService _stokPaketService;
    public CustomReportResolverWithFallBack(IReportResolver parentResolver, IStokPaketService stokPaketService)
    {
        this._parentResolver = parentResolver;
        _stokPaketService = stokPaketService;
    }
    public ReportSource Resolve(string report)
    {
        var reportDocument = this.CustomReportResolver(report);
        if (null == reportDocument
           && null != this._parentResolver)
        {
            reportDocument = this._parentResolver.Resolve(report);
        }
        return reportDocument;
    }
    public ReportSource CustomReportResolver(string report)
    {
        var type = Type.GetType(report);
        var reportInstance = (Report)Activator.CreateInstance(type);
        //in this case, report data source brings 32,000 rows of data
        var reportData = _stokPaketService.GetCStokPakets("GOLF").ToList();
        var objectDataSouce = new ObjectDataSource { DataSource = reportData }; 
        reportInstance.DataSource = objectDataSouce;
        return reportInstance;
    }
}

【问题讨论】:

  • 感谢您发布这个问题提供了很多帮助

标签: telerik reporting reportviewer asp.net-web-api telerik-reporting


【解决方案1】:

我假设有更好的方法可以做到这一点,但我所做的是通过创建一个序列化的 JSON 对象将所有参数放入 reportSource.report 参数中。然后在 CustomerReportResolver() 方法中,我使用 Newtonsoft.Json 库反序列化对象。所以类似于以下内容:

var json = {};
json.reportType = "BeeSp.ReportLibrary.Stok.RprStokPaket, BeeSp.ReportLibrary";
json.rows = 10;

$("#reportViewer1")
    .telerik_ReportViewer({
        serviceUrl: "http://localhost:2404/api/StokPaketList/",
        templateUrl: '../ReportViewer/templates/telerikReportViewerTemplate.html',
        reportSource: {
            report: JSON.stringify(json),
            parameters: {
                CultureID: "en"
            }
        }
    });

然后在服务器端:

public ReportSource CustomReportResolver(string report)
{
    JToken token = JObject.Parse(report);

    int rows = (int)token["rows"];
    string reportType = (string)token["reportType"];
}

然后在数据源对象上,您可以像添加任何其他参数一样添加行参数。

【讨论】:

  • 非常感谢这项工作,我花了一整天的时间来解决这个问题,但最后找到了你的答案,如果可以加倍投票,我会把所有的票都给你
猜你喜欢
  • 2015-08-10
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多