Asp.net web api Telerik Html5报表查看器客户端参数未应用
telerik报告版本2014年第二季度SP1(8.1.14.804) 我使用默认的ReportTypeResolver实现了一个asp.NETMVC4WebAPI报表服务器。报表是使用vs2010报表设计器设计的,因此报表id是“类,dll” 报告工作正常,但它使用设计器中定义的“测试”报告参数,而不是客户端发送的参数。我可以在fiddler中看到传递给服务的参数,但它们不应用于报表 reportscontroller如下所示:Asp.net web api Telerik Html5报表查看器客户端参数未应用,asp.net-web-api,telerik-reporting,Asp.net Web Api,Telerik Reporting,telerik报告版本2014年第二季度SP1(8.1.14.804) 我使用默认的ReportTypeResolver实现了一个asp.NETMVC4WebAPI报表服务器。报表是使用vs2010报表设计器设计的,因此报表id是“类,dll” 报告工作正常,但它使用设计器中定义的“测试”报告参数,而不是客户端发送的参数。我可以在fiddler中看到传递给服务的参数,但它们不应用于报表 reportscontroller如下所示: Public Class 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
公共类CustomReportResolver
实现IReportResolver
公共函数Resolve(reportId为字符串)作为ReportSource实现IReportResolver.Resolve
Dim rpt作为新报告。ItemReport
使某人成为新的架线工
使用xmlWriter作为System.Xml.xmlWriter=System.Xml.xmlWriter.Create(sb)
Dim xmlSerializer作为新的Telerik.Reporting.XmlSerialization.ReportXmlSerializer()
序列化(xmlWriter,rpt)
终端使用
Dim reportSource作为新的Telerik.Reporting.XmlReportSource()
'ReportTitle参数的向下脏替换。。。
reportSource.Xml=sb.ToString.Replace(“报告”、“foobar”)
返回报告源
端函数
末级
自我回答:
我的结论是,这是由于我对报告参数如何工作的误解。报表查看器旨在显示一个参数区域,用户在该区域输入报表参数,然后点击刷新(如果参数自动刷新为false)。查看器小部件设置中的参数将预先填充此区域中的匹配参数,但如果所有参数都不可见或可见,并且具有默认值(设计器提供的值),则报告最初将以默认值呈现。我的所有参数都不可见,因为我打算使用自己的参数设置,这有两个作用:第一,它导致报表在初始化时呈现;第二,它阻止预览按钮的显示。因此,报告总是以默认值呈现,这使人产生忽略传递参数的错觉
现在,由于我不打算使用内置参数区域,我在解析器中设置了报告参数。为此,我传递报告名,后跟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
自我回答:
我的结论是,这是由于我对报告参数如何工作的误解。报表查看器旨在显示一个参数区域,用户在该区域输入报表参数,然后点击刷新(如果参数自动刷新为false)。查看器小部件设置中的参数将预先填充此区域中的匹配参数,但如果所有参数都不可见或可见,并且具有默认值(设计器提供的值),则报告最初将以默认值呈现。我的所有参数都不可见,因为我打算使用自己的参数设置,这有两个作用:第一,它导致报表在初始化时呈现;第二,它阻止预览按钮的显示。因此,报告总是以默认值呈现,这使人产生忽略传递参数的错觉
现在,由于我不打算使用内置参数区域,我在解析器中设置了报告参数。为此,我传递报告名,后跟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
我开始认为自定义解析器不是这样做的地方,虽然可以通过一些技巧将参数附加到报告id中…因为客户端查看器有一个参数集合,该集合必须是预期使用的技术,而且我认为它应该是自动的,所以我一定出了什么问题…我开始认为自定义解析程序不是执行此操作的地方,虽然可以通过一些技巧将参数附加到报告id中…因为客户端查看器有一个参数集合,它必须是预期使用的技术,而且我认为它应该是自动的,所以我一定是出了什么问题。。。