如何通过会话变量维护文化

时间:2014-11-07 10:21:37

标签: c# asp.net webforms

我有一个多语言的Web表单Web应用程序,我正在使用资源文件和一个BasePage类,它根据继承自此类的页面中包含的QueryString设置文化。这一切都运作良好,如果有点笨重,因为我必须为每个按钮执行此类操作,将用户带到另一个页面以维护文化:

if (Thread.CurrentThread.CurrentCulture.ToString() == "cy-GB")
{
    return "~/Secure/Details.aspx?lang=cy-GB&PersonId=" + currentPersonId;
}
else
{
    return "~/Secure/Details.aspx?PersonId=" + currentPersonId;  
}

我知道可能有更好的方法可以做到这一点,但作为一个新手,因为它工作我只是做了。

直到我必须实施asp:SiteMapPath控件。我最初假设我可以简单地为url属性创建资源条目,就像我为title所做的那样:

<siteMapNode 
    title="$resources:SiteMapLocalizations,HomePageTitle" 
    description="Home" 
    url="~$resources:SiteMapLocalizations,HomePageUrl">

然而,这导致服务器错误:

  

从客户端(:)检测到潜在危险的Request.Path值。

我已经完成了一些阅读,我相信我需要以某种方式将当前文化存储到会话变量中,该变量将跟随用户,因此当他们点击“主页”时在痕迹上它将与文化保持一致并从资源文件中获取相应的文本,我也希望这将允许我删除我必须写的所有IF ELSE语句在整个申请过程中保持现有语言。

然而,我的问题是,从哪里开始,为了达到这个目的,我找不到一步一步的指导,任何人都可以提供一些指示吗?

2 个答案:

答案 0 :(得分:0)

看一下这个链接。它解释了你想要实现的目标。

http://adamyan.blogspot.se/2010/02/aspnet-mvc-2-localization-complete.html

答案 1 :(得分:0)

确保您有某种触发语言更改的按钮。在我的情况下,我有两个版本的标题,一个带有英文链接,将查询字符串附加到英语,一个用于威尔士,如:

<强> ASP

<a id="languagelink" runat="server" title="Cymraeg">Cymraeg</a>

<强> C#

    if (Thread.CurrentThread.CurrentCulture.ToString() == "en-GB")
    {
        Uri uri = new Uri(currentPage);
        languagelink.HRef = String.Format(uri.GetLeftPart(UriPartial.Path)+"?lang=cy-GB");         
    }

每个需要语言切换的页面都需要从我的自定义BasePage继承,如下所示:

<强>继承

public partial class Secure_CustomerSummary : BasePage

<强> Base_Page

public partial class BasePage : System.Web.UI.Page
    {
        protected override void InitializeCulture()
        {
            if (Session["language"] == null)
            {
                Session["language"] = "en-GB";
            }

            else
            {
                if (Request.QueryString["lang"] == null)
                {
                    SetSessionCulture();
                }

                if (Request.QueryString["lang"] != null)
                {
                    string qs = Request.QueryString["lang"];
                    Session["language"] = qs;
                }

                SetSessionCulture();
            }

            SetSessionCulture();           
        }

        private void SetSessionCulture()
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Session["language"].ToString());
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Session["language"].ToString());
            base.InitializeCulture();
        }
    }