在 ASP.NET 中以编程方式处理资源文件
本文将介绍如何动态处理资源文件。
引言
有时候,你需要开发一个多语言网站。为此,你需要在 ASP.NET 中维护资源文件 (.resx)。你需要为你网站支持的每种语言创建资源文件。但如果你的客户想要更改资源文件中输入的文本,你会怎么做?
背景
我不会解释关于全球化的任何内容。CodeProject 上已经有很多文章对此进行了很好的解释,你可以参考。
Using the Code
在这里,我使用一个 BasePage
类,其中有一个方法可以返回我正在使用的 Resource 文件的当前路径。
protected string CurrentRes
{
get
{
if (null != Session["SelectResource"])
{
if(System.IO.File.Exists(Session["SelectResource"].ToString()))
{
return Session["SelectResource"].ToString();
}
}
return Server.MapPath("App_GlobalResources\\Resource.resx");
}
}
现在,将 BasePage.cs 类继承到我的 aspx 页面会将文件路径和名称返回给我。在页面加载时,我将 Gridview
与资源文件绑定为 dataset
,以向用户显示文件的内容。
当用户单击“插入”按钮时,将调用方法 insertElement
,该方法有两个参数:Name
和 Value
。在这里,创建一个新的 xmldocument
对象并定义 xmlnodes
。确保你继承了 System.Xml
和 System.Resources
。然后,我在加载 XML 文档后创建了一个根节点。
以下是要遵循的步骤
- 创建一个父节点 '
data
',节点类型为 element。 - 创建一个 XML 属性 '
name
'。 - 将
xmlnode
与属性附加。 - 如果存在子节点,则重复相同的步骤。
- 最后,调用
saveDoc()
方法以将更改保存在资源文件中。
public void insertElement(string name, string value)
{
XmlDocument doc = new XmlDocument();
XmlNode child = null;
XmlNode xname = null;
XmlNode rootnode = null;
doc.Load(FileName);
rootnode = doc.SelectSingleNode("root");
xname = doc.CreateNode(XmlNodeType.Element,"data",null);
XmlAttribute xa = doc.CreateAttribute("name");
xa.Value = name;
XmlAttribute xa1 = doc.CreateAttribute("xml","space",null);
xa1.Value = "preserve";
xname.Attributes.Append(xa);
xname.Attributes.Append(xa1);
child = doc.CreateNode(XmlNodeType.Element, "value", null);
child.InnerText = value;
xname.AppendChild(child);
rootnode.AppendChild(xname);
saveDoc(doc, FileName);
}
SaveDoc
方法将插入/更新操作保存到 Resource.resx 文件。 SaveDoc
接受两个参数:文档名称和路径,将 XML 文本写入 doc 文件并保存。
private void saveDoc(XmlDocument doc, string docPath)
{
try
{
XmlTextWriter writer = new XmlTextWriter(docPath, null);
writer.Formatting = Formatting.Indented;
doc.WriteTo(writer);
writer.Flush();
writer.Close();
return;
}
catch{
throw;
}
}
以同样的方式,你可以更新资源文件。从 Grid 中选择一条记录。由于 Name
参数始终是唯一的,因此资源 Value
字段将被更新。以下是更新的代码片段。
public void updateElement(string name, string value)
{
XmlDocument doc = new XmlDocument();
XmlNode rootnode = null;
doc.Load(FileName);
rootnode = doc.SelectSingleNode("//root");
XmlNode xnode = rootnode.SelectSingleNode("//data[@name='" + name + "']/value");
xnode.InnerText = value;
saveDoc(doc, FileName);
DataBinder();
}
将 Grid 与资源文件绑定
以下代码显示了我们如何将 grid 与资源文件绑定。此解决方案适用于 MVS-2008 或更高版本。请注意,在下面的代码片段中,我只绑定了 dataset
中的“data”表。 dataset
包含多个表,例如“metadata
”、“resource
”,但我们只需要“data
”表。通过这种方式,我们可以将 grid 与资源文件绑定。
private void bindgrid()
{
DataSet dsgrid = new DataSet();
DataTable dt = new DataTable();
try
{
dsgrid.ReadXml(CurrentRes);
dt.Merge(dsgrid.Tables["data"]);
dt.AcceptChanges();
this.grdResource.DataSource = dt;
this.grdResource.DataBind();
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
}
finally
{
if (dsgrid != null)
{
dsgrid.Dispose();
dsgrid = null;
}
}
}
如果你使用的是 MVS-2005 或更低版本,你只需要将 grid
与 dataset
绑定。
需要注意的点
确保在 name
字段中创建一个新条目时不要输入空格,因为它是一个唯一的字段,并且不能在其中包含空格。还要确保你输入唯一的 Name
。 Value
可以是变量或相同。
结论
在本文中,我们已经了解了如何动态管理资源文件,从而为最终用户提供用户友好的界面,从而使事情更加清晰易于处理。在处理多语言站点时,资源文件就像主干。这为动态和健壮的系统开辟了无数的可能性。