添加一个如下的配置表:
|
控件类型 |
控件ID |
控件属性 |
资源ID |
|
Literal |
ltUserName |
Text |
10000001 |
|
Button |
btnSave |
Text |
10000002 |
|
Button |
btnSave |
ToolTip |
10000003 |
在PageBase类中,添加如下一个方法来实现页面元素的多语化:
protected coid Localize(string cultureNo)
重写OnPreRender方法,在OnPreRender方法中调用Localize方法,Localize遍历配置表中属于当前页面的控件,为每个控件都取出资源值并赋给相应属性,示例代码如下:
protected virtual void Localize(string cultureNo)
{
string fileName = System.IO.Path.GetFileName(this.Request.Path);
string pathName = MapPath(fileName + ".xml"); //配置文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathName);
XmlNode rootNode = xmlDoc.SelectSingleNode("Controls");
XmlNodeList controls = rootNode.SelectNodes("Control");
foreach (XmlNode node in controls)
{
string id = node.SelectSingleNode("ID").InnerText;
string property = node.SelectSingleNode("Property").InnerText;
string resId = node.SelectSingleNode("ResourceID").InnerText;
string resText = GetResText(cultureNo, resId); //读取资源
//通过反射赋值
Control ctrl = this.FindControl(id);
Type type = ctrl.GetType();
PropertyInfo propertyInfo = type.GetProperty(property);
propertyInfo.SetValue(ctrl, resText, null);
}
}
配置表的格式:
<?xml version="1.0" encoding="utf-8"?>
<Controls>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>Text</Property>
<ResourceID>10000001</ResourceID>
</Control>
<Control>
<ID>Literal1</ID>
<Type>Literal</Type>
<Property>Text</Property>
<ResourceID>10000002</ResourceID>
</Control>
<Control>
<ID>Label1</ID>
<Type>Label</Type>
<Property>Text</Property>
<ResourceID>10000003</ResourceID>
</Control>
<Control>
<ID>btnOK</ID>
<Type>Button</Type>
<Property>ToolTip</Property>
<ResourceID>10000001</ResourceID>
</Control>
</Controls>
优点:开发的时候不需要做任何操作,甚至不需要象方案一一样设置资源ID,只需要添加一张配置表即可让基类完成95%的情况,其余5%的情况通过重写Localize方法可以实现。
缺点:对于DataGrid等控件中的子控件,不能通过FindControls来找到。
浙公网安备 33010602011771号