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

ASP.NET 2.0 的可本地化下拉菜单

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (5投票s)

2007年2月2日

CPOL

3分钟阅读

viewsIcon

45088

downloadIcon

83

这段代码展示了如何创建一个简单的可本地化下拉菜单,它从合适的文本中设置选项。

Sample image

引言

这段代码展示了如何创建一个简单的可本地化下拉菜单,它从合适的文本格式中设置选项。我通常会使用带有许多 <option...> 的 HTML <select...> 标签,并且我想要一个可本地化的下拉菜单,它可以捕获诸如 <option> 标签列表或任何其他数据列表之类的数据。问题是标准的 ASP.NET 2.0 下拉菜单允许从资源中获取文本,但仅适用于每个选项,而不适用于整个下拉控件。因此,自定义下拉菜单应该:

  1. 简单易用。
  2. 可本地化(即从资源中捕获数据)。
  3. 不需要编写任何额外的代码。

使用代码

经过一些思考并获得建议后,我决定唯一的好方法是创建标准下拉控件的子类。第一步是在 *App_Code* 文件夹中创建我们的自定义下拉类。在类声明之前,放入以下代码

[DefaultProperty("InnerText"), 
ToolboxData("<{0}:CustomDropDown runat="server">")]

这里我们指定控件的默认标签。然后我们应该为要解析的文本添加成员

private string innerText;
[Localizable(true)]
<Bindable(true), Category("Appearance"), DefaultValue("")>
public string InnerText
{
   get
   {
       return innerText;
   }
   set
   {
       innerText = value;
   }
}

我们未来的属性将出现在“外观”类别中,并且值为“”。然后我们添加 Prepare 方法,该方法解析文本并填充下拉列表的项目

public void Prepare()
{
    if (innerText == string.Empty || innerText == "")
        return;
    if (Items.Count > 0)
        return;
    string sep = separator == "" ? "@" : separator;
    innerText = innerText.Replace("</option /><option />", sep);
    innerText = innerText.Replace("</option />\r\n<option />", sep);
    innerText = innerText.Replace("</option />", "");
    innerText = innerText.Replace("<option />", "");
    innerText = innerText.Replace("—", "-");
    innerText = innerText.Replace("'", "'");
    string[] cc = innerText.Split(new string[] { sep },
        StringSplitOptions.RemoveEmptyEntries);
    foreach (string c in cc)
    {
        this.Items.Add(new ListItem(c));
    }
}

这很简单。它只是分割字符串,删除项目之间多余的标签(例如 “<option>”),并填充列表。唯一需要更多描述的是分隔符。它允许我们使用不同格式的源文本。它可以是常见的“逗号分隔值”或真实的“<options...></options>”标签列表。首先,我们只是将源文本用分隔符替换,然后分割字符串。例如,如果我们有标签列表,我们可以使用“,”分隔符,但如果我们的字符串本身包含“,”符号,我们将遇到问题。在这种情况下,最好使用另一个分隔符,例如“@”。这样的分隔符将是默认值。我们添加分隔符声明,例如

private string separator = "";
[Localizable(true)]
<Bindable(true), Category("Appearance"), DefaultValue("")>
public string Separator
{
    get
    {
        return separator;
    }

    set
    {
        separator = value;
    }
}

我们在页面加载时调用 Prepare 方法

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    Prepare();
}

然后我们应该设置文化。代码的最佳位置是页面的 InitializeCulture 方法

protected override void InitializeCulture()
{
    string lang = "en-US";
    if (Request.QueryString["lang"] != null)
    {
        switch (Request.QueryString["lang"])
        {
            case "rus":
                lang = "ru-RU";
                break;
            case "eng":
                lang = "en-US";
                break;
        }
    }
    System.Globalization.CultureInfo ci = new
                 System.Globalization.CultureInfo(lang);
    System.Threading.Thread.CurrentThread.CurrentCulture = ci;
    System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
    base.InitializeCulture();
}

这是一个特殊的方法,在创建任何控件之前很早就被调用。在这个例子中,我们设置了两种文化之一:英语或俄语(你可以使用你想要的任意数量的语言)。我们通过点击链接来切换文化

<asp:HyperLink ID="HyperLink1" runat="server" 
   NavigateUrl="~/Default.aspx?lang=rus">rus</asp:HyperLink>
          
<asp:HyperLink ID="HyperLink2" runat="server" 
   NavigateUrl="~/Default.aspx?lang=eng">eng</asp:HyperLink>

每个链接都传递相应的“lang”参数。下一步是将我们的控件添加到页面

<ddc:CustomDropDown ID="Countries" 
   InnerText="<%$ Resources:Resource, CountriesCombo%>" 
   runat="server" Width="320px" style="margin-top:5px" 
   Separator="@"></ddc:CustomDropDown>

不要忘记注册我们的控件

<%@ Register Namespace="CustomControls"  TagPrefix="ddc"  %>

最后,我们应该添加资源。在给定的示例中,我们在 *App_GlobalResources* 中创建了三个资源文件 - *Resource.resx*,*Resource.en-US.resx* 和 *Resource.ru-RU.resx*。然后在每个文件中,我们添加一个名为 CountriesCombo 的新项目并将文本放入其中。然后我们编译项目... 成了!

© . All rights reserved.