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

使用动态 SiteMapPath 文件进行导航

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.83/5 (21投票s)

2006年1月16日

2分钟阅读

viewsIcon

137835

本文演示了使用 SiteMapPath 扩展菜单生成的 ASP.NET 2.0 功能。

引言

本文演示了使用 SiteMapPath 扩展菜单生成的 ASP.NET 2.0 功能。在这里,我将展示如何使用运行时 XmlTextWriter 生成 Web.Sitemap 文件,并从 SQL Server 检索数据。

代码

首先,我想向您展示数据库结构,我在数据库中有两个表

  1. Master
  2. 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();
}
© . All rights reserved.