Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api Telerik Html5报表查看器客户端参数未应用_Asp.net Web Api_Telerik Reporting - Fatal编程技术网

Asp.net web api Telerik Html5报表查看器客户端参数未应用

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

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

我使用默认的ReportTypeResolver实现了一个asp.NETMVC4WebAPI报表服务器。报表是使用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
公共类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中…因为客户端查看器有一个参数集合,它必须是预期使用的技术,而且我认为它应该是自动的,所以我一定是出了什么问题。。。