【问题标题】:Telerik Html5 report viewer client side parameters not being appliedTelerik Html5 报告查看器客户端参数未应用
【发布时间】:2017-07-09 01:42:03
【问题描述】:

telerik 报告 2014 年第二季度 SP1 (8.1.14.804)

我使用默认的 ReportTypeResolver 实现了一个 asp.net mvc 4 web api 报告服务器。报表是使用vs2010报表设计器设计的,所以报表id是“class,dll”。

报告工作正常,但它使用的是设计器中定义的“测试”报告参数,而不是客户端发送的参数。我可以在 fiddler 中看到正在传递给服务的参数,但它们并未应用于报告。

报告控制器如下所示:

Public Class ReportsController

    Inherits ReportsControllerBase

    Protected Overrides Function CreateCache() As Interfaces.ICache
        Return CreateFileCache()
    End Function


    Protected Overrides Function CreateReportResolver() As IReportResolver
        Return New ReportTypeResolver
    End Function

End Class

html5 小部件:

$("#reportViewer1").telerik_ReportViewer({
serviceUrl: "http://server/api/reports",
templateUrl: "telerikReportViewerTemplate-8.1.14.804.html",
reportSource: {
    report: "Reports.ItemReport, Reports",
    parameters: {
        CultureID: "en",
        mydata: "some_data"
    }
}

});

我认为它应该是“自动的”,但由于它不是我怀疑我需要向服务器控制器添加一些东西以某种方式将客户端参数获取到报告中。

由于我使用的是旧版本,因此文档与我所拥有的不完全匹配,而且在许多情况下,这些文档都非常不足。

现在我正在使用为 silverlight 应用程序设计和工作的报告,并不是说服务器端对此有任何关心,但在 silverlight 中,我通过拦截 ReportViewer1_RenderBegin 事件并获取 getReportParams 对象来传递参数。

问:如何将客户端参数传递给报表?

编辑:

好的,我发现如果我创建一个自定义报表解析器,将报表对象序列化为 xml,然后更改它们传递给报表的参数...问题是我不知道如何获取客户端值。

这是一个肮脏的测试实现:

Public Class CustomReportResolver

Implements IReportResolver

Public Function Resolve(reportId As String) As ReportSource Implements IReportResolver.Resolve

    Dim rpt As New Reports.ItemReport

    Dim sb As New StringBuilder
    Using xmlWriter As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(sb)
        Dim xmlSerializer As New Telerik.Reporting.XmlSerialization.ReportXmlSerializer()
        xmlSerializer.Serialize(xmlWriter, rpt)
    End Using

    Dim reportSource As New Telerik.Reporting.XmlReportSource()

    'down and dirty replace of ReportTitle parameter...
    reportSource.Xml = sb.ToString.Replace("<String>Report</String>", "<String>Foo-Bar</String>")

    Return reportSource
End Function

End Class

【问题讨论】:

  • 我开始认为自定义解析器不是执行此操作的地方,尽管可以通过一些技巧将参数附加到报告 ID...因为客户端查看器有必须是预期使用的技术的 params 集合,我认为它应该是自动的,所以我一定有问题......

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


【解决方案1】:

自我回答:

我得出的结论是,我对报告参数的工作方式存在误解。报表查看器旨在显示用户输入报表参数然后点击刷新的参数区域(如果参数自动刷新为假)。查看器小部件设置中的参数将预先填充此区域中的匹配参数,但如果所有参数不可见或不可见并且具有默认值(设计器提供),则报告将首先使用默认值呈现。我的所有参数都不可见,因为我打算拥有自己的参数设置,它做了两件事,首先它导致报告在初始化时呈现,其次它阻止了预览按钮的显示。因此,报表总是使用默认值呈现,给人一种它忽略了传递的参数的错觉。

现在,由于我打算不使用内置参数区域,因此我在解析器中设置了报告参数。为此,我传递报告名称,后跟一个 url 编码的参数列表,然后在解析器中创建一个名称-值集合并将值分配给报告参数。

现在,如果我不为参数提供设计器值,报告会显示有关缺少参数的错误,因此仍然会发生一些有趣的事情,但我的解决方案确实以我希望的方式解决了问题。

在html中:

$("#reportViewer1").telerik_ReportViewer({
serviceUrl: "https://server/api/reports",
templateUrl: "telerikReportViewerTemplate-8.1.14.804.html",
reportSource: {
    report: "ItemReport?sortBy=0&allDates=true&ItemList=0,1,2,3,7,10&ReportTitle=it works!",
    parameters: {
        CultureID: "en"
    }
}

});

然后在api中:

Public Function Resolve(reportId As String) As ReportSource Implements IReportResolver.Resolve

    Dim theReport = reportId.Substring(0, reportId.IndexOf("?"))

    Dim rpt As Object = Nothing
    Select Case theReport
        Case "ItemReport"
            rpt = New Reports.ItemReport
    End Select

    Dim queryString As String = reportId.Substring(reportId.IndexOf("?") + 1)
    Dim params As NameValueCollection = HttpUtility.ParseQueryString(queryString)

    For Each k As String In params
        rpt.ReportParameters(k).Value = params(k)
    Next

    Dim sb As New StringBuilder
    Using xmlWriter As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(sb)
        Dim xmlSerializer As New Telerik.Reporting.XmlSerialization.ReportXmlSerializer()
        xmlSerializer.Serialize(xmlWriter, rpt)
    End Using

    Dim reportSource As New Telerik.Reporting.XmlReportSource()
    reportSource.Xml = sb.ToString

    Return reportSource

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2011-05-10
    • 2014-07-22
    • 2022-08-15
    相关资源
    最近更新 更多