C# ASP登录时语言区域性恢复为默认值

C# ASP登录时语言区域性恢复为默认值,c#,asp.net,culture,C#,Asp.net,Culture,我在使用CurrentCulture显示威尔士语/英语内容时遇到一些问题。考虑以下事项: 我有一个母版页,包含两个页眉和两个页脚,都是英语/威尔士语的。我在母版页的页面加载事件中有此代码块: if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB") { Footer1.Visible = false; Footer2.Visible = true;

我在使用
CurrentCulture
显示威尔士语/英语内容时遇到一些问题。考虑以下事项:

我有一个
母版页
,包含两个页眉和两个页脚,都是英语/威尔士语的。我在
母版页的
页面加载
事件中有此代码块

    if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
    {                
        Footer1.Visible = false;
        Footer2.Visible = true;
        Header1.Visible = false;
        Header2.Visible = true;
    }

    if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
    {                
        Footer2.Visible = false;
        Footer1.Visible = true;
        Header1.Visible = true;
        Header2.Visible = false;
    }
我在标题的威尔士语和英语版本中有一个链接,名为
languagelink
,它触发了文化的变化,如下所示:

header.cy GB.ascx.cs

protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();

            //The culture is welsh, set the language change link to English
            if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=en-GB");
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();                      

            //The culture is English, set the language change link to Welsh
            if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=cy-GB");
            }
         }
public partial class Secure_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string debug = Thread.CurrentThread.CurrentCulture.ToString();
            RoleRedirect();
        }

        public void RoleRedirect()
        {
            if (MembershipUtil.IsCurrentUserAdmin())
            {

                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx");               
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx?lang=cy-GB");                
                }         

            }
            else
            {
                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx");         
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx?lang=cy-GB");          
                }

            }
        }
    }
标题.en GB.ascx.cs

protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();

            //The culture is welsh, set the language change link to English
            if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=en-GB");
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();                      

            //The culture is English, set the language change link to Welsh
            if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=cy-GB");
            }
         }
public partial class Secure_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string debug = Thread.CurrentThread.CurrentCulture.ToString();
            RoleRedirect();
        }

        public void RoleRedirect()
        {
            if (MembershipUtil.IsCurrentUserAdmin())
            {

                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx");               
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx?lang=cy-GB");                
                }         

            }
            else
            {
                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx");         
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx?lang=cy-GB");          
                }

            }
        }
    }
这一切都很好,但是在我的“主页”上,你必须使用ASP会员身份登录,我注意到,如果我点击
languagelink
按钮切换到威尔士语,然后登录,一旦我进入下一页,文化就会恢复为“en GB”。我的印象是,一旦文化发生了变化,它将保持这种状态,直到应用程序另有说明。从登录页面,用户被重定向到
Default.aspx
,其中执行以下操作:

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();

            //The culture is welsh, set the language change link to English
            if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=en-GB");
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            string currentPage = Request.Url.AbsoluteUri.ToString();                      

            //The culture is English, set the language change link to Welsh
            if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
            {
                Uri uri = new Uri(currentPage);
                languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path) + "?lang=cy-GB");
            }
         }
public partial class Secure_Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string debug = Thread.CurrentThread.CurrentCulture.ToString();
            RoleRedirect();
        }

        public void RoleRedirect()
        {
            if (MembershipUtil.IsCurrentUserAdmin())
            {

                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx");               
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/Admin/Default.aspx?lang=cy-GB");                
                }         

            }
            else
            {
                if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx");         
                }

                if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
                {
                    Response.Redirect("~/Secure/CustomerSummary.aspx?lang=cy-GB");          
                }

            }
        }
    }
如果我在浏览母版页时将语言设置为威尔士语,并且加载了标题页,那么文化就是威尔士语,一切都是我所期望的。但是,当我登录并再次执行步骤时,当断点点击
Default.aspx.cs
上的
string debug
行时,区域性会返回到
en GB
,即使它被设置为威尔士语?有人能告诉我这里可能发生了什么吗

编辑

我可能应该提到我创建了一个BasePage类,上面所有的页面(登录、默认、CustomerSummary)都继承自:

public partial class BasePage : System.Web.UI.Page
{
    protected override void InitializeCulture()
    {
        string qs = Request.QueryString["lang"];
        if (qs != null)
        {
            string language = null;
            language = Request.QueryString["lang"].ToString();
            UICulture = language;
            Culture = language;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(language);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
            base.InitializeCulture();
        }            
    }
}

在哪里设置当前线程区域性?您必须在每次调用中设置当前区域性,因为不同的线程可以为不同的请求提供服务。区域性的更改是在单击languagelink链接时设置的,这将向URL添加查询字符串。您实际在哪里设置当前线程区域性?您是否有一些代码可以查找查询字符串参数并对Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture进行赋值?请注意,必须为每个页面请求执行区域性分配。请参见编辑,我有一个类处理此问题,并且提到的所有页面都继承自此问题。是否在所有页面请求上传递“lang”参数?如果不是,那就是你失去文化的原因。如果不希望在每个请求上传递查询字符串参数,可以将其绑定到会话(最初在“选择区域性页面”中选择时),然后使用会话值在InitializeCulture实现中设置当前区域性。