65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (47投票s)

2007年5月11日

CPOL

2分钟阅读

viewsIcon

251237

downloadIcon

3978

MasterPage 派生自 UserControl,因此不支持 'InitializeCulture()' 方法;为了使 ASP.NET MasterPage 可本地化,需要更多的编码。

引言

在互联网上寻找使用 MasterPage 在 ASP.NET 应用程序中实现本地化的解决方案时,我意识到很多人都遇到了同样的问题需要解决。不幸的是,我找不到合适的解决方案,因此我打算自己实现。

背景

本文中提出的解决方案使用 .NET 框架的标准本地化机制。

使用代码

发布的解决方案使用 Session 对象作为当前所选文化的存储。 这将在 global.asax 文件中的 Session_Start 方法期间初始化。

如果用户请求更改区域性,则 MasterPage 会更改 Session 对象中存储的区域性。

在一个继承自 PageBasePage 中,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 中。 为了确定请求的语言,使用 LinkButtonCommandArgument 属性。

..以及母版页的代码隐藏

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 日 - 命名空间已更正
© . All rights reserved.