使用动态 SiteMapPath 文件进行导航






2.83/5 (21投票s)
2006年1月16日
2分钟阅读

137835
本文演示了使用 SiteMapPath 扩展菜单生成的 ASP.NET 2.0 功能。
引言
本文演示了使用 SiteMapPath 扩展菜单生成的 ASP.NET 2.0 功能。在这里,我将展示如何使用运行时 XmlTextWriter
生成 Web.Sitemap 文件,并从 SQL Server 检索数据。
代码
首先,我想向您展示数据库结构,我在数据库中有两个表
- Master
- Child
以下是表的截图
Master
Child
为了从数据库中获取数据,我创建了两个连接
string _sqlconnString =
"server=yoursever;User ID=sa;Password=sa;database=test";
SqlConnection source = new SqlConnection(_sqlconnString);
// Create destination connection
SqlConnection destination = new SqlConnection(_sqlconnString);
//Open connections
source.Open();
destination.Open();
// Select data from Products table
SqlCommand cmd = new SqlCommand("SELECT * FROM Master", source);
SqlCommand cmd1 = new SqlCommand("SELECT * FROM Child", destination);
// Execute reader
SqlDataReader reader1 = cmd.ExecuteReader();
从数据库获取数据后,我查看了 Web.Sitemap 文件的格式,该文件必须遵循一定的格式。根节点必须是 <siteMap>
,然后是 <siteMapNode>
。第一个 SiteMapNode
指的是菜单的根级别,因此您不能在 <SiteMap>
标签下拥有多个 <SiteMapNode>
。因此,一个格式良好的站点地图的 XML 应该如下所示
<?xml version="1.0" encoding="utf-8"?>
<siteMap>
<siteMapNode title="hello" description="hello" url="hello">
<siteMapNode title="Himanshu"
description="Himanshu ALive" url="http://www.yah1oo.com">
<siteMapNode title="Himanshu1"
description="Himanshu1 Alive" url="http://www.yah3oo.com" />
<siteMapNode title="Himanshu2"
description="Himanshu2 Alive" url="http://www.ya4hoo.com" />
</siteMapNode><siteMapNode title="Dhami"
description="Dhami Alive" url="http://www.ya2hoo.com">
<siteMapNode title="Dhami1"
description="Dhami1 Alive" url="http://www.ya5hoo.com" />
<siteMapNode title="Dhami2"
description="Dhami2 Alive" url="http://www.ya6hoo.com" />
</siteMapNode><siteMapNode title="Dell"
description="Dell Alive" url="http://www.dell.com" />
</siteMapNode>
</siteMap>
现在是有趣的部分,我们需要根据从 SQL Server 检索的数据生成上述 XML 文件。如上所述,我们打开了两个与数据库的连接,用于从 Master 和 Child 表中检索数据。
第一步是创建 XML 文件,我们将使用 XMLTextWriter
来完成,如下所示
//Create XML
Encoding enc = Encoding.UTF8;
XmlTextWriter objXMLTW = new XmlTextWriter(sFileName, enc);
其中 sFileName
是您要生成 Web.SiteMap 文件的应用程序根目录的路径。对我来说,大概是这样的
sFileName=D:\VS2005PROJECTS\TESTASPNET\Web.SiteMap
现在我们已经创建了 XML 文件,所以我们需要根据获取的数据创建所需的结构。
<siteMapNode>
需要三个属性
Title
:在菜单中显示。Description
:这可以是任何内容。URL
:单击时链接到其他网站。
现在,我粘贴代码以生成 <siteMap>
和第一个 <siteMapNode>
。您可以按照指定的注释
try
{
objXMLTW.WriteStartDocument();//xml document open
//'Top level (Parent element)
//root node open
objXMLTW.WriteStartElement("siteMap");
//first Node of the Menu open
objXMLTW.WriteStartElement("siteMapNode");
objXMLTW.WriteAttributeString("title",
"Home");//Title attribute set
objXMLTW.WriteAttributeString("description",
"This is home");//Description attribute set
objXMLTW.WriteAttributeString("url",
"http://www.home.com");//URL attribute set
//Loop and create nodes
上面的代码将生成菜单的根节点和第一个节点,如下所示
<?xml version="1.0" encoding="utf-8"?>
<siteMap>
<siteMapNode title="hello" description="hello" url="hello">
完成此操作后,我们将循环遍历主 DataReader
并创建主节点元素
while (reader1.Read())
{
int MasterID = reader1.GetInt32(0);
objXMLTW.WriteStartElement("siteMapNode");
objXMLTW.WriteAttributeString("title",
reader1.GetString(1));
objXMLTW.WriteAttributeString("description",
reader1.GetString(2));
objXMLTW.WriteAttributeString("url",
reader1.GetString(3));
在同一个循环中,我们将循环遍历子 DataReader
,如果主表的主 ID 与子表的主 ID 匹配,那么我们还将为子元素生成 <SiteMapNode>
。这可以根据主表和子表的结构进一步深入。
为了检索所需的数据,我们将打开子 DataReader
,如下所示
SqlDataReader reader2 = cmd1.ExecuteReader();
while (reader2.Read())
{
int ChildMasterID = reader2.GetInt32(1);
if (MasterID == ChildMasterID)
{
//Open Child Element
objXMLTW.WriteStartElement("siteMapNode");
objXMLTW.WriteAttributeString("title",
reader2.GetString(2));
objXMLTW.WriteAttributeString("description",
reader2.GetString(3));
objXMLTW.WriteAttributeString("url",
reader2.GetString(4));
objXMLTW.WriteEndElement();//Close Child Element
}
}
reader2.Close();//Close the child datareader
objXMLTW.WriteEndElement();//Close the siteMapNode
之后,我们只需要关闭第一个 siteMapNode
并关闭 XML 文档的创建
}
objXMLTW.WriteEndElement();//Close the first siteMapNode
objXMLTW.WriteEndDocument();//xml document closed
}
finally
{
objXMLTW.Flush();
objXMLTW.Close();
}
destination.Close();
source.Close();
上面的代码在应用程序的根目录中生成所需的 Web.SiteMap 文件,并且您需要使用上面显示的代码编写一个函数。只需在 Page_Load
中调用该函数,它将在每次运行时更新 Web.SiteMap 文件。示例菜单如下所示
整个代码看起来像这样
private void GenerateXMLFile(string sFileName)
{
string _sqlconnString =
"server=nouswk124;User ID=sa;Password=sa;database=test";
string _destsqlconnString =
"server=nouswk124;User ID=sa;Password=sa;database=test";
SqlConnection source = new SqlConnection(_sqlconnString);
// Create destination connection
SqlConnection destination = new SqlConnection(_destsqlconnString);
//Open connections
source.Open();
destination.Open();
// Select data from Products table
SqlCommand cmd = new
SqlCommand("SELECT * FROM Master", source);
SqlCommand cmd1 = new
SqlCommand("SELECT * FROM Child", destination);
// Execute reader
SqlDataReader reader1 = cmd.ExecuteReader();
//Create XML
Encoding enc = Encoding.UTF8;
XmlTextWriter objXMLTW = new XmlTextWriter(sFileName, enc);
try
{
objXMLTW.WriteStartDocument();//xml document open
//'Top level (Parent element)
//root node open
objXMLTW.WriteStartElement("siteMap");
//first Node of the Menu open
objXMLTW.WriteStartElement("siteMapNode");
//Title attribute set
objXMLTW.WriteAttributeString("title", "Home");
objXMLTW.WriteAttributeString("description",
"This is home");//Description attribute set
objXMLTW.WriteAttributeString("url",
"http://www.home.com");//URL attribute set
//Loop and create nodes
while (reader1.Read())
{
int MasterID = reader1.GetInt32(0);
objXMLTW.WriteStartElement("siteMapNode");
objXMLTW.WriteAttributeString("title",
reader1.GetString(1));
objXMLTW.WriteAttributeString("description",
reader1.GetString(2));
objXMLTW.WriteAttributeString("url",
reader1.GetString(3));
//objXMLTW.WriteString("No Nonsense" +
i.ToString());
SqlDataReader reader2 = cmd1.ExecuteReader();
while (reader2.Read())
{
int ChildMasterID = reader2.GetInt32(1);
if (MasterID == ChildMasterID)
{
//Open Child Element
objXMLTW.WriteStartElement("siteMapNode");
objXMLTW.WriteAttributeString("title",
reader2.GetString(2));
objXMLTW.WriteAttributeString("description",
reader2.GetString(3));
objXMLTW.WriteAttributeString("url",
reader2.GetString(4));
objXMLTW.WriteEndElement();
//Close Child Element
}
}
reader2.Close();//Close the child datareader
objXMLTW.WriteEndElement();//Close the siteMapNode
}
objXMLTW.WriteEndElement();//Close the first siteMapNode
objXMLTW.WriteEndDocument();//xml document closed
}
finally
{
objXMLTW.Flush();
objXMLTW.Close();
}
destination.Close();
source.Close();
}