2

我有一个登录页面,用户可以通过单选按钮选择他的语言,登录后用户被重定向到 Default.aspx,我使用以下方法设置页面文化:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%>
<%@ Import Namespace="System.Resources" %>
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
<script runat=server>
        protected override void InitializeCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["lang"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["lang"].ToString());
            base.InitializeCulture();
        }
</script>

如何将登录页面中选择的语言传递给 Default.aspx 页面中的此方法?我试图通过会话传递它,但我收到了这个错误:

System.NullReferenceException:“对象引用未设置为对象的实例。” System.Web.SessionState.HttpSessionState.this[string].get 返回 null。

因为此方法发生在任何控制或会话启动之前的早期阶段,这就是它返回 null 的原因。知道如何将选定的文化传递给这种方法吗?

4

4 回答 4

0

在您的代码中,“lang”在哪里加载到 Session 中?

我相信这告诉您 SessionState 中不存在“lang”,而 SessionState 本身不可用。

于 2017-05-29T01:42:46.847 回答
0

您是将其设置为默认值还是允许用户选择它?

如果是前者,那么只需将其放入您的 App.xaml.cs 中:

[assembly: NeutralResourcesLanguage("en-US")]

如果您担心线程文化,也可以这样做:

var culture = CultureInfo.CreateSpecificCulture("en-US");

if (Thread.CurrentThread.CurrentCulture.Name != "en-US")
{
    var culture = CultureInfo.CreateSpecificCulture("en-US");
    CultureInfo.DefaultThreadCurrentCulture = culture;
    CultureInfo.DefaultThreadCurrentUICulture = culture;
}
于 2017-05-29T03:04:47.110 回答
0

改变网页的文化,如 MSDN

<%@ Page Language="C#" uiculture="auto" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Globalization" %>
<script runat="server">
protected override void InitializeCulture()
{
    if (Request.Form["ListBox1"] != null)
    {
        String selectedLanguage = Request.Form["ListBox1"];
        UICulture = selectedLanguage ;
        Culture = selectedLanguage ;

        Thread.CurrentThread.CurrentCulture = 
            CultureInfo.CreateSpecificCulture(selectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new 
            CultureInfo(selectedLanguage);
    }
    base.InitializeCulture();
}
</script>
于 2017-05-29T03:43:41.983 回答
0

我找到了答案,我设法使用查询字符串传递了选定的文化信息:

在我的登录页面中,我有这两个单选按钮和一个按钮:

<asp:RadioButton ID="RadioButton1" runat="server" Text="ar-AE" />
<asp:RadioButton ID="RadioButton2" runat="server" Text="en-US" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

在按钮 OnClick 后面的代码中:

protected void Button1_Click(object sender, EventArgs e)
    {
        if (RadioButton1.Checked)
        {
            Response.Redirect("Default.aspx?language=" + RadioButton1.Text);
        }
        else
        {
            Response.Redirect("Default.aspx?language=" + RadioButton2.Text);
        }
    }

然后在 Default.aspx 页面我有这个代码:

<% @Import Namespace="System.Resources" %>
<% @Import Namespace="System.Globalization" %>
<% @Import Namespace="System.Threading" %>
<script runat=server>
    protected override void InitializeCulture()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.QueryString["language"].ToString());
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.QueryString["language"].ToString());
        base.InitializeCulture();
    }
</script>

我也尝试使用 Cookie,但它像会话一样返回 null,因此查询字符串是唯一对我有用的方法。

于 2017-05-29T18:57:36.710 回答