2017-02-19 6 views
1

Telerik Berichte ver Q2 2014 SP1 angewendet wird (8.1.14.804)Telerik Html5 Report Viewer Client-Seite Parameter nicht

I Implementiert eine asp.net Mvc 4 Web api Berichtsserver den Standard ReportTypeResolver verwenden. Berichte werden mit dem vs2010-Berichtsdesigner erstellt, daher ist die Berichts-ID die "Klasse, DLL".

Der Bericht funktioniert einwandfrei, verwendet jedoch die im Designer definierten Berichtsparameter 'test' und nicht die vom Client gesendeten Parameter. Ich kann die Parameter sehen, die in Fiddler an den Service übergeben werden, aber sie werden nicht auf den Bericht angewendet.

Die reportscontroller sieht wie folgt aus:

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 

Das html5 widget:

$("#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" 
    } 
} 

});

Ich dachte, es sollte "automatisch" sein, aber da es nicht ich vermute, muss ich etwas zum Server-Controller hinzufügen, um irgendwie den Client-Parameter zum Bericht zu bekommen.

Da ich eine ältere Version verwende, stimmen die Dokumente nicht genau mit dem, was ich habe, und die Dokumente sind in vielen Fällen verlockend unzureichend.

Jetzt verwende ich Berichte, die für eine Silverlight-App entworfen und bearbeitet wurden, nicht, dass die Server-Seite sich darum kümmert, aber in silverlight habe ich die Parameter übergeben, indem ich das ReportViewer1_RenderBegin-Ereignis abgefangen und das getReportParams-Objekt abgerufen habe.

F: Wie kann ich clientseitige Parameter an den Bericht übergeben?

EDIT:

OK, ich herausgefunden, wenn ich einen benutzerdefinierten Bericht Resolver erstellen, die der Bericht Objekt als XML serialisiert und dann die Parameter ändern, sie an den Bericht übergeben zu tun bekommen ... Problem ist, ich weiß nicht, wie man die clientseitigen Werte bekommt.

Hier ist ein schmutziges Testimplementierung:

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

Ich fange die benutzerdefinierte Resolver zu denken ist nicht der Ort, dies zu tun, obwohl es dort durch ein Trick getan werden könnte, um die params des Berichts-ID anhängen. ..wenn der Client-Viewer eine Params-Sammlung hat, die MUSS die beabsichtigte Technik sein sollte, und ich denke, es sollte automatisch sein, also muss ich etwas falsch haben ... – kpg

Antwort

0

Selbst Antwort:

ich zu dem Schluss gekommen, dies zu einem Missverständnis meinerseits zurückzuführen ist, wie Berichtsparameter arbeiten. Der Berichts-Viewer wurde entwickelt, um einen Parameterbereich anzuzeigen, in dem der Benutzer Berichtsparameter eingibt und dann auf Aktualisieren klickt (wenn der Parameter Auto-Refresh falsch ist). Die Parameter im Setup des Viewer-Widgets füllen die entsprechenden Parameter in diesem Bereich vor. Wenn jedoch alle Parameter entweder nicht sichtbar oder sichtbar sind und einen Standardwert (vom Designer bereitgestellt) haben, wird der Bericht zunächst mit den Standardwerten gerendert. Ich hatte alle Parameter nicht sichtbar, weil ich meine eigenen Parametereinstellungen haben möchte, die zwei Dinge taten, zuerst verursachte es den Bericht, auf Initialisierung zu rendern, zweitens verhinderte es Anzeige des Vorschauknopfes. Daher wurde der Bericht immer mit den Standardwerten gerendert, wodurch die Illusion erzeugt wurde, dass die übergebenen Parameter ignoriert wurden.

Jetzt, da ich den integrierten Parameterbereich nicht verwenden möchte, setze ich die Berichtsparameter im Resolver. Dazu gebe ich den Berichtsnamen gefolgt von einer URL-codierten Liste von Parametern, dann im Resolver eine Name-Wert-Sammlung erstellen und die Werte den Berichtsparametern zuweisen.

Jetzt, wenn ich einem Parameter keinen Designer-Wert zur Verfügung stelle, zeigt der Bericht einen Fehler über einen fehlenden Parameter, also gibt es immer noch ein paar lustige Sachen, aber meine Lösung löst das Problem so, wie ich es gelöst haben wollte .

im 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" 
    } 
} 

});

dann im 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 
Verwandte Themen