c# - 将自定义文化与 ReportViewer 一起使用会返回 CultureNotFoundException

标签 c# asp.net reporting-services reportviewer cultureinfo

我的网站使用这样创建的自定义区域性:

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:不支持文化。参数名称:culture 4096 (0x1000) 是无效的文化标识符

经过大量谷歌搜索后,我发现很多其他人都在问同样的问题,不幸的是总是没有人回答。 This article非常清楚地描述了问题,但没有提供任何解决方案。

是否有人可以提供解决方案(如果不能提供解决方案)?

最佳答案

由于没有答案,我不得不破解:

首先,我创建了一个 CustomReportViewer,继承自原生 Microsoft.Reporting.WebForms.ReportViewer 覆盖 OnPreRender 方法。它检查登录用户的文化(保存在 session 中)并回滚到父文化(如果有)。

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à

我不会接受这个希望有人能想出一些东西的答案......更干净

关于c# - 将自定义文化与 ReportViewer 一起使用会返回 CultureNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27404755/

相关文章:

c# - ASP.NET 动态表单生成和提交

ssrs-2008 - SSRS 2008 R2 更改生产与测试的共享数据源

reporting-services - SSRS 矩阵百分比

c# - 在 C# 中使用 Javascript 变量

c# - 我可以查询 mysql DB 但无法保存对其的更改

c# - LINQ C# 查询的逻辑是什么?

javascript - 无法在 JavaScript 中启用按钮

c# - 配置方法中的asp net core请求服务返回null

html - 如何以正确的方式旋转-90 单元格?

sql-server - 如何在移动报表发布器中创建 SQL Server 连接