将自定义区域性与 ReportViewer 结合使用将返回 CultureNotFoundException
本文关键字:返回 CultureNotFoundException ReportViewer 自定义 区域性 结合 | 更新日期: 2023-09-27 18:33:47
我的网站使用如下所示创建的自定义区域性:
var cib = new CultureAndRegionInfoBuilder("en-gb-xxxx", CultureAndRegionModifiers.None);
cib.LoadDataFromCultureInfo(new CultureInfo("en-gb"));
cib.LoadDataFromRegionInfo(new RegionInfo("en"));
cib.Register();
并且像这样使用:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-gb-xxxx");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-gb-xxxx");
直到我想使用 ReportViewer 控件呈现报表为止,一切正常。报告文本呈现正常,但图像失败,我收到以下错误:
System.Globalization.CultureNotFoundException: 不支持区域性。参数名称:区域性 4096 (0x1000) 是无效的区域性标识符
经过很多谷歌搜索,我发现很多人都在问同样的问题,不幸的是总是没有答案。本文非常清楚地描述了该问题,但没有提供任何解决方案。
如果不是修复,有没有人可以提供解决方法?
由于没有答案,我不得不破解我的方式:
首先,我创建了一个CustomReportViewer
,继承了本机Microsoft.Reporting.WebForms.ReportViewer
覆盖OnPreRender
方法。它会检查已记录用户的区域性(保存在会话中),并回滚到父区域性(如果有)。
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);
}
然后我更改了 aspx 页中的对象:
<web:CustomReportViewer ID="ReportViewer1" runat="server" AsyncRendering="false" SizeToReportContent="true" ProcessingMode="Remote">
Et voilà
我不会接受这个答案,希望有人能想出一些东西......cleaner
我找到了上述问题的解决方案:
问题:
在报表查看器中不支持导出区域性。参数名称:区域性 4096 (0x1000) 是无效的区域性标识符。
溶液::
1.)在顶部添加以下指令
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
或
using System.Threading;
using System.Globalization;
2.) 添加事件,如下所示:
protected void FPReportViewer_PreRender(object sender, EventArgs e)
{
CultureInfo ci = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
3.) 更新报告查看器 html 标记,如下所示:
<rsweb:ReportViewer runat="server" ID="FPReportViewer" OnPreRender="FPReportViewer_PreRender" AsyncRendering="false" width="100%" SizeToReportContent="True"> </rsweb:ReportViewer>
愿此代码对您有所帮助。
多谢!
在发送到 SSRS 之前尝试此操作
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture =
CultureInfo.DefaultThreadCurrentCulture =
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US");
例如:
[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();
}