ASP.NET 2.0 的可本地化下拉菜单
这段代码展示了如何创建一个简单的可本地化下拉菜单,它从合适的文本中设置选项。
引言
这段代码展示了如何创建一个简单的可本地化下拉菜单,它从合适的文本格式中设置选项。我通常会使用带有许多 <option...>
的 HTML <select...>
标签,并且我想要一个可本地化的下拉菜单,它可以捕获诸如 <option>
标签列表或任何其他数据列表之类的数据。问题是标准的 ASP.NET 2.0 下拉菜单允许从资源中获取文本,但仅适用于每个选项,而不适用于整个下拉控件。因此,自定义下拉菜单应该:
- 简单易用。
- 可本地化(即从资源中捕获数据)。
- 不需要编写任何额外的代码。
使用代码
经过一些思考并获得建议后,我决定唯一的好方法是创建标准下拉控件的子类。第一步是在 *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
的新项目并将文本放入其中。然后我们编译项目... 成了!