L’utilizzo della cultura personalizzata con ReportViewer restituisce un’eccezione CultureNotFoundException

Il mio sito web utilizza culture personalizzate create in questo modo:

var cib = new CultureAndRegionInfoBuilder("en-gb-xxxx", CultureAndRegionModifiers.None); cib.LoadDataFromCultureInfo(new CultureInfo("en-gb")); cib.LoadDataFromRegionInfo(new RegionInfo("en")); cib.Register(); 

E che vengono utilizzati in questo modo:

 Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-gb-xxxx"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-gb-xxxx"); 

Funziona tutto bene fino al punto in cui voglio eseguire il rendering di un report con il controllo ReportViewer. Il testo del report viene visualizzato correttamente ma le immagini falliscono e viene visualizzato il seguente errore:

System.Globalization.CultureNotFoundException: Culture non è supportato. Nome parametro: cultura 4096 (0x1000) è un identificatore di cultura non valido

Dopo molte ricerche su google ho trovato molte altre persone che facevano la stessa domanda, purtroppo rimase sempre senza risposta. Questo articolo descrive il problema molto chiaramente ma non offre alcuna soluzione.

C’è qualcuno che potrebbe offrire se non una soluzione, una soluzione?

Non essendo arrivata nessuna risposta, ho dovuto scavare la mia strada:

Per prima cosa ho creato un CustomReportViewer , che eredita dal nativo Microsoft.Reporting.WebForms.ReportViewer sovrascrive il metodo OnPreRender . Controlla la cultura dell’utente registrato (salvato in Session) e torna alla cultura genitore, se presente.

 protected override void OnPreRender(EventArgs e) { var culture = new CultureInfo(HttpContext.Current.Session["UserCulture"]); if (culture.CompareInfo.LCID != culture.LCID){ var baseCulture = new CultureInfo(culture.CompareInfo.LCID); System.Threading.Thread.CurrentThread.CurrentCulture = baseCulture; System.Threading.Thread.CurrentThread.CurrentUICulture = baseCulture; } base.OnPreRender(e); } 

Quindi ho cambiato l’object nella pagina aspx:

  

Et voilà

Non accetterò questa risposta sperando che qualcuno possa inventare qualcosa … più pulito

Ho trovato la soluzione del problema precedente:

Problema:

In Report Viewer su export Culture non è supportato. Nome parametro: cultura 4096 (0x1000) è un identificatore di cultura non valido.

Soluzione::

1.) Aggiungi sotto la direttiva in alto

 <% @Import Namespace="System.Globalization" %> <% @Import Namespace="System.Threading" %> 

O

 using System.Threading; using System.Globalization; 

2.) Aggiungi evento come di seguito:

 protected void FPReportViewer_PreRender(object sender, EventArgs e) { CultureInfo ci = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; } 

3.) Aggiornare il tag hdtml di Reportviewer come di seguito:

   

questo codice può aiutarti.

Molte grazie!

Provalo prima di inviarlo a SSRS

  Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 

per esempio:

  [SessionExpire] public ActionResult ReportProduct(string ExpenseCenter) { Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US"); ReportViewer reportViewer = new ReportViewer(); reportViewer.ProcessingMode = ProcessingMode.Remote; reportViewer.SizeToReportContent = true; reportViewer.AsyncRendering = false; reportViewer.ZoomMode = ZoomMode.FullPage; reportViewer.Width = Unit.Percentage(100); reportViewer.Height = Unit.Percentage(100); var serverReport = reportViewer.ServerReport; serverReport.ReportPath = "/Reports/ReportPrice"; serverReport.ReportServerUrl = new Uri("http://ssrs-server:94/ReportServer_MSSQLSERVER2016/"); serverReport.SetParameters(GetParametersServer()); serverReport.Refresh(); ViewBag.ReportViewer = reportViewer; return View(); }