2017-02-19 20 views
1

版本Q2 2014 SP1(8.1.14.804)Telerik的Html5的報告觀察者客戶端的參數沒有被應用

我實現使用默認ReportTypeResolver一個asp.net MVC 4網頁API報告服務器Telerik的報告。報告是使用vs2010報告設計器設計的,因此報告ID是「class,dll」。

該報告工作正常,但它使用的是設計人員定義的「測試」報告參數,而不是客戶端發送的報告參數。我可以看到參數傳遞給服務在提琴手,但他們不適用於報告。

的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對象來傳遞參數。

問:如何將客戶端參數傳遞給報表?

編輯:

OK,我想通了,如果我創建一個自定義報告解析,序列化的報告對象爲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

我開始覺得定製解析器是不是要做到這一點的地方,雖然也可以通過一些技巧也做了PARAMS附加到報告ID。 ..因爲客戶端查看器有一個PARMS集合,必須是使用的預期技術,我認爲它應該是自動的,所以我必須有一些錯誤... – kpg

回答

0

自我回答:

我已得出結論,這是由於我的一個誤解爲報表參數是如何工作的。報告查看器用於顯示用戶輸入報告參數然後觸發刷新的參數區域(如果參數自動刷新爲false)。查看器小部件設置中的參數將預先填充此區域中的匹配參數,但如果所有參數都不可見或可見,並且具有默認(設計器提供的)值,報告將首先以默認值呈現。我所有的參數都不可見,因爲我打算有我自己的參數設置,它做了兩件事,一是它首先導致報告在初始化時呈現,二是阻止顯示預覽按鈕。因此報告總是使用默認值進行呈現,從而給出它忽略傳遞參數的錯覺。

現在,因爲我打算不使用內置參數區域,我在解析器中設置了報告參數。爲此,我傳遞報告名稱,後跟一個url編碼的params列表,然後在解析器中創建一個名稱 - 值集合並將值分配給報告參數。

現在,如果我沒有爲參數提供設計器值,報告會顯示關於缺少參數的錯誤,所以仍然會出現一些有趣的內容,但我的解決方案確實以我想要的方式解決了問題。

在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 
相關問題