在ASP.NET应用程序中实现语言菜单的最佳方法

在ASP.NET应用程序中实现语言菜单的最佳方法,asp.net,localization,master-pages,globalization,Asp.net,Localization,Master Pages,Globalization,我试图实现一个典型的语言菜单,用户可以通过一个出现在网站所有页面上的菜单来选择他们想要查看网站的语言 该菜单将出现在多个母版页上(当前一个用于用户登录的页面,另一个用于用户未登录的页面) 我当前的实现只有一个母版页基类(我们称之为MasterBase)。MasterBase有一个事件 public event LanguageChangedEventHandler LanguageChanged; 其中LanguagedChangedEventHandler的定义如下 public deleg

我试图实现一个典型的语言菜单,用户可以通过一个出现在网站所有页面上的菜单来选择他们想要查看网站的语言

该菜单将出现在多个母版页上(当前一个用于用户登录的页面,另一个用于用户未登录的页面)

我当前的实现只有一个母版页基类(我们称之为MasterBase)。MasterBase有一个事件

public event LanguageChangedEventHandler LanguageChanged;
其中LanguagedChangedEventHandler的定义如下

public delegate void LanguageChangedEventHandler(string NewCulture);
MasterBase还有一个可重写的方法

protected virtual void OnLanguageChanged(string NewCulture)
这基本上激发了事件

继承MasterBase的每个母版页都会重写OnLanguageChanged,并执行诸如设置线程的当前UICulture和语言cookie之类的常规操作,然后执行

Server.Transfer(this.Page.AppRelativeVirtualPath, true);
使页面重新加载新区域性的本地化值。在登录用户的母版页上,它还更新数据库中用户的语言pref

每个语言选项当前都是从MasterBase继承的母版页上的链接按钮。单击链接时,它将调用传递正确区域性信息的base-OnLanguagedChanged方法。例如

protected void btnEnglish_Click(object sender, EventArgs e) {
    this.OnLanguageChanged("en-US");
    }
每个需要处理语言更改的页面在页面加载中都有一些代码,看起来像

((MasterBase)this.Master).LanguageChanged += this.Page_OnLanguageChanged;
// Where Page_OnLanguageChanged has the signature of LanguageChangedEventHandler
// and has stuff like reloading options in a drop down using the new language.
相当复杂的“框架”=)

  • 首先,新开发人员很难知道他们必须将一个方法连接到MasterBase的LanguageChanged事件以处理语言更改。是的,我们有记录。但这仍然不是简单明了的事情
  • 第二,所有的语言变化都是回发的。这是有问题的,尤其是当您想使用浏览器的“后退”按钮返回时
  • 我在寻找一个更优雅的解决方案。一个既没有上述问题,又能处理我当前需求的系统


    非常感谢您的建议。谢谢。

    在我看来,最好在设置所有页面都可以使用的应用程序变量的控件中实现这一点。这样,您就可以在一个地方实现代码,并使它始终在显示控件的每个页面上可用(可以在母版中,以便所有继承的页面都自动获得它)。我认为在控件中有一个处理程序设置全局语言设置,然后重新加载页面。每个页面都会在页面加载或预呈现期间检查语言设置,并相应地加载适当的本地化字符串。

    我只会使用基本页面上的
    PreInit
    事件来设置当前的ui区域性。我不清楚为什么您需要每个页面都知道语言何时更改。

    很有帮助,但仍然无法解决不需要回发的问题。