2017-11-02 4 views
0

Alle,RDLC Report - Wie lokalisierte String-Werte Code innerhalb des Berichts mit benutzerdefinierten Zugriff auf

ich ein Upgrade bin von .net 2 4.6 .net, aber ich habe ein Problem mit meinem RDLC (. Dh lokal) berichtet.

Insbesondere mein RDLC meldet Referenzcode von einer meiner Assemblys, die Zugriff auf sprachspezifische RESX-Dateien ausführt. Dadurch kann ich Berichtsausdrücke erstellen, die sprachspezifische Zeichenfolgen und Wörter sprachunabhängig referenzieren.

Alles hat super geklappt, bis wir von .net 2 bis .net 4. Mit den neuen CAS Änderungen wechselten ich gezwungen wurde, Code neu zu schreiben, die specificially einen Assemblyverweis von diesem fügt hinzu:

report.AddTrustedCodeModuleInCurrentAppDomain(); 

dazu:

Aber jetzt habe ich beobachtet, dass dies dazu führt, dass meine benutzerdefinierte DLL zum zweiten Mal in den Bericht ohne aktuellen HTTP-Kontext geladen wird. Ohne aktuellen HTTP-Kontext habe ich keine Möglichkeit, meine Zeichenfolge RESX-Dateien über den Zugriff auf:

String localizedValue = 
       (string)HttpContext.GetGlobalResourceObject(
        resourceFile, resourceKey); 

Deshalb habe ich einige Optionen, aber Unterstützung benötigen, wie Sie erreichen diese:

BTW, vorbei lang bestimmte Zeichenfolge über Parameter ist keine Option wirklich, weil ich viele Strings habe, das würde viele benutzerdefinierte Parameter bedeuten.

1) Eine andere Möglichkeit zum Abrufen langspezifischer Strings aus meinen .resx-Dateien (gibt es eine andere Methode, die ich ohne HttpContext.GetGlobalResourceObject aufrufen kann)? Oder ich muss manuell laden .resx Dateien und Parsing sie (das wäre viel Arbeit)

2) Irgendwie bekommen aktuellen HTTP-Kontext in meinem Bericht Kontext. Ich habe versucht, hier clever zu sein und habe einen statischen ctor erstellt, in dem ich meine statische Variable auf den aktuellen HTTP-Kontext initialisiert habe. Leider wird dies nicht funktionieren, da die Berichts-Engine, wenn sie die Ausdrücke im Bericht auswertet, eine andere Version derselben Assembly lädt (beobachtet, als ich sie debuggte).

3) Eine andere Lösung, wie von Ihnen vorgeschlagen.

+0

Können Sie nicht die ResourceManager-Klasse dazu verwenden? –

+0

Es macht mir nichts aus zu versuchen, Sie haben einen Link zu einem Beispiel? Hinweis: Meine Ressourcenzeichenfolgen befinden sich in separaten RESX-Dateien. – ActiveX

+0

Ich habe es noch nie gemacht, aber es erscheint plausibel ... Wenn Sie eine Assembly in Ihrem Bericht referenzieren, muss sie im Ordner ReportServer \ bin bereitgestellt und darauf zugegriffen werden. Können Sie Ihre Satellitenassemblies und resx lang-Ordner in diesen bin-Ordner werfen und dann einen Wrapper erstellen, um den ResourceManager wie in einer Windows-Anwendung aufzurufen, ohne HttpClient zu benutzen? Der einzige Weg, dies in Ihrer Web-Anwendung zu tun, wäre eine gewisse Hack-Post-Rendering-Verarbeitung, wenn die Nutzdaten des Berichts zurückgegeben werden. –

Antwort

0

Nach der Untersuchung verschiedener möglicher Möglichkeiten ist die eleganteste Lösung, eine Satelliten-Assembly von Sprachzeichenfolgen zu erstellen und dann die ResourceManager-Klasse zu verwenden, um die Assembly zu laden und die Strings von einer anderen Assembly abzurufen.

FYI: Damit dies funktioniert, müssen Sie die Satellitenbaugruppe im Ordner bin haben.

Verwandte Themen