其他分享
首页 > 其他分享> > 结合使用自定义文化和ReportViewer返回CultureNotFoundException

结合使用自定义文化和ReportViewer返回CultureNotFoundException

作者:互联网

我的网站使用如下创建的自定义区域性:

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)是无效的区域性标识符

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

有没有人可以提供解决方法,而不是提供解决方法?

解决方法:

由于没有答案,我不得不破解自己的方法:

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

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

Etvoilà

我不会接受这个答案,希望有人可以提出一些建议…清洁工

标签:reportviewer,cultureinfo,reporting-services,asp-net,c
来源: https://codeday.me/bug/20191121/2048061.html