使用 MasterPage 和本地化开发 ASP.NET 页面






4.57/5 (47投票s)
MasterPage 派生自 UserControl,因此不支持 'InitializeCulture()' 方法;为了使 ASP.NET MasterPage 可本地化,需要更多的编码。
引言
在互联网上寻找使用 MasterPage
在 ASP.NET 应用程序中实现本地化的解决方案时,我意识到很多人都遇到了同样的问题需要解决。不幸的是,我找不到合适的解决方案,因此我打算自己实现。
背景
本文中提出的解决方案使用 .NET 框架的标准本地化机制。
使用代码
发布的解决方案使用 Session
对象作为当前所选文化的存储。 这将在 global.asax 文件中的 Session_Start
方法期间初始化。
如果用户请求更改区域性,则 MasterPage
会更改 Session
对象中存储的区域性。
在一个继承自 Page
的 BasePage
中,InitializeCulture
方法被重写,并将存储在 Session
对象中的适当区域性信息设置到当前线程。 因此,每个 Web Form 都需要派生自这个 BasePage
。
让我们从 *Global.asax* 文件开始
void Session_Start(object sender, EventArgs e)
{
//set english as default startup language
Session["MyCulture"] = "en-GB";
}
或者,可以在 *Web.config* 文件中使用键 <globalization culture="en-GB" />
定义区域性,然后从 Session_Start
方法中处理并存储在 Session
对象中。
下一步是母版页
<%@ Master Language="C#" AutoEventWireup="true"
CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>[HelveticSolutions - Masterpage with Localization Support]</title>
</head>
<body>
<form id="theForm" runat="server">
<div>
<asp:contentplaceholder id="ContentPlaceHolder" runat="server">
</asp:contentplaceholder>
</div>
<div style="margin-top:20px;">
<asp:LinkButton ID="btnSetGerman" runat="server" Text="Deutsch"
CommandArgument="de-CH" OnClick="RequestLanguageChange_Click">
</asp:LinkButton>
<asp:LinkButton ID="btnSetEnglish" runat="server" Text="English"
CommandArgument="en-GB" OnClick="RequestLanguageChange_Click">
</asp:LinkButton>
</div>
</form>
</body>
</html>
更改区域性的按钮可以直接放置在 MasterPage
中,也可以放置在任何嵌入式 UserControl
中。 为了确定请求的语言,使用 LinkButton
的 CommandArgument
属性。
..以及母版页的代码隐藏
public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void RequestLanguageChange_Click(object sender, EventArgs e)
{
LinkButton senderLink = sender as LinkButton;
//store requested language as new culture in the session
Session["MyCulture"] = senderLink.CommandArgument;
//reload last requested page with new culture
Server.Transfer(Request.Path);
}
}
在 CommandArgument
中传递的请求语言将被处理并存储在 Session
对象中。 之后,最初请求的页面将在服务器端重新加载。
最后但并非最不重要的一点是,BasePage
/// <summary>
/// Custom base page used for all web forms.
/// </summary>
public class BasePage : Page
{
private const string m_DefaultCulture = "en-GB";
protected override void InitializeCulture()
{
//retrieve culture information from session
string culture = Convert.ToString(Session["MyCulture"]);
//check whether a culture is stored in the session
if (!string.IsNullOrEmpty(culture)) Culture = culture;
else Culture = m_DefaultCulture;
//set culture to current thread
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
//call base class
base.InitializeCulture();
}
}
如上所述,InitializeCulture
方法被重写,并从 Session
对象中获取存储的区域性并将其分配给当前运行的线程。
备注:在本文中,仅提到了区域性。 当然,还有 UI 区域性。 但它在本文中没有任何进一步的兴趣,因为处理方式是完全相同的。 有关更多信息,请参见 MSDN 页面。 :)
有关运行示例,请下载上面的 Zip 文件。
历史
- 2007 年 5 月 11 日 - 发布第一个版本。
- 2014 年 11 月 16 日 - 命名空间已更正