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

在 ASP.NET 中以编程方式处理资源文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (6投票s)

2010年11月4日

CPOL

3分钟阅读

viewsIcon

55105

downloadIcon

1327

本文将介绍如何动态处理资源文件。

引言

有时候,你需要开发一个多语言网站。为此,你需要在 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,该方法有两个参数:NameValue。在这里,创建一个新的 xmldocument 对象并定义 xmlnodes。确保你继承了 System.XmlSystem.Resources。然后,我在加载 XML 文档后创建了一个根节点。

以下是要遵循的步骤

  1. 创建一个父节点 'data',节点类型为 element。
  2. 创建一个 XML 属性 'name'。
  3. xmlnode 与属性附加。
  4. 如果存在子节点,则重复相同的步骤。
  5. 最后,调用 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 或更低版本,你只需要将 griddataset 绑定。

需要注意的点

确保在 name 字段中创建一个新条目时不要输入空格,因为它是一个唯一的字段,并且不能在其中包含空格。还要确保你输入唯一的 NameValue 可以是变量或相同。

结论

在本文中,我们已经了解了如何动态管理资源文件,从而为最终用户提供用户友好的界面,从而使事情更加清晰易于处理。在处理多语言站点时,资源文件就像主干。这为动态和健壮的系统开辟了无数的可能性。

© . All rights reserved.