telerik报告2014年第二季度SP1(8.1.14.804)
我使用默认的ReportTypeResolver实现了一个asp.net mvc 4 web api报表服务器。报告是使用vs2010报告设计器设计的,因此报告ID是"类,dll"。
报告工作得很好,但它正在使用'测试'报告设计器中定义的参数,而不是客户端发送的参数。我可以在fiddler中看到传递给服务的参数,但它们不会应用于报告。
reportscontroller看起来像这样:
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
答案 0 :(得分:0)
自答案:
我得出的结论是,由于我对报告参数的工作方式存在误解。报表查看器旨在显示用户输入报表参数然后命中刷新的参数区域(如果参数自动刷新为假)。查看器窗口小部件设置中的参数将预先填充此区域中的匹配参数,但如果所有参数都不可见或可见并且具有默认(设计者提供的)值,则报表将首先使用默认值进行渲染。我有所有参数都不可见,因为我打算让我自己的参数设置做两件事,首先它导致报告在初始化时渲染,其次,它阻止显示预览按钮。因此,报告始终使用默认值进行渲染,从而产生忽略传递参数的错觉。
既然我打算不使用内置参数区域,我在解析器中设置了报告参数。为此,我传递报告名称,后跟url编码的params列表,然后在解析器中创建一个名称 - 值集合并将值分配给报告参数。
现在,如果我没有为参数提供设计器值,报告会显示有关缺少参数的错误,那么仍然会有一些有趣的事情发生,但我的解决方案确实以我想要的方式解决了问题。
在html中:
this.props.event
});
然后在api中:
$("#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"
}
}