站内搜索:     
站点首页破釜学院编程开发.NETASP.NET → ASP.NET 2.0站点地图搭建网站导航结构
正在加载相关信息.....
Web 站内搜索
ASP.NET 2.0站点地图搭建网站导航结构
】【打印】【加入收藏】【关闭收藏到新浪ViVi】【收藏到365KEY】 浏览字号:
日期:2006-06-29 人气: 出处:天极

四、 使用SiteMap数据源控件

  站点地图的使用并不仅限于SiteMapPath控件。你还可以把站点地图依附到可导航控件(例如TreeView)上。在下列例子中,你将使用相同的站点地图文件来实现与一个TreeView控件的绑定。

  把一个新的Web表单SiteMapDataSourceDemo.aspx添加到网站上。然后,把一个SiteMap数据源控件(SiteMapDataSource1)和一个TreeView控件(TreeView1)拖动到表单上。把这个TreeView控件的DataSourceID属性设置为SiteMapDataSource1。另外,还要把该TreeView控件的ShowLines属性设置为true。下面是SiteMapDataSourceDemo.aspx页面中的完整的标记:

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="SiteMapDataSourceDemo.aspx.cs"
Inherits="SiteMapDataSourceDemo" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
 <form id="form1" runat="server">
  <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1"
ShowLines="True">
  </asp:TreeView>
  <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
 </form>
</body>
</html>
  现在,运行这个Web表单以观察相同的导航结构是怎样被自动生成到TreeView中的(见图8)。

图8:把网站地图文件绑定到一个TreeView控件

五、 使用SiteMap类

  在SiteMapPath或TreeView控件中显示站点地图数据效果太好了。然而,有时你可能需要设计定制生成逻辑。例如,你可能想开发一个定制的导航控件—它仅为了垂直地显示其父级。在这样的情况下,你需要以编程方式来存取这个站点地图文件。SiteMap类允许你准确地实现这一点。

  这个SiteMap路径具有两个重要的属性:RootNode和CurrentNode。它们的类型都是SiteMapNode,并且它们都能使你分别参考站点地图的根结点和当前结点。表格7列举了SiteMapNode类的一些重要的属性。

属性 描述
ChildNodes 代表当前结点的所有子结点的集合
HasChildNodes 指示是否站点地图结点具有子结点(true/false)
Title 返回在站点地图文件中指定的title属性的值
Url 返回在站点地图文件中指定的url属性的值
Description 返回在站点地图文件中指定的description属性的值
ParentNode 指出当前结点的父站点地图结点的参考

    表格7:SiteMapNode类的一些重要的属性

  下面的示例使用了SiteMap路径来存取一个站点地图文件的单个结点。然后,以编程方式把它们添加到一个TreeView控件。

  添加一个称为SiteMapCustom.aspx的Web表单。然后,把一个TreeView控件拖动到其上。把列表代码添加到这个Web表单的Page_Load事件:

protected void Page_Load(object sender, EventArgs e)
{
 int count = SiteMap.RootNode.ChildNodes.Count;
 for (int i = 0; i < count; i++)
 {
  SiteMapNode smNode=SiteMap.RootNode.ChildNodes[i];
  TreeNode tvNode = new TreeNode(smNode.Title, "", "", smNode.Url, "");
  TreeView1.Nodes.Add(tvNode);
  if (smNode.HasChildNodes)
  {
   int childCount=smNode.ChildNodes.Count;
   for (int j = 0; j < childCount; j++)
   {
    SiteMapNode smChildNode = smNode.ChildNodes[j];
    TreeNode tvChildNode = new TreeNode(smChildNode.Title,
     "", "",
     smChildNode.Url, "");
    tvNode.ChildNodes.Add(tvChildNode);
   }
  }
 }
}
  在这里,你首先得到根结点中的子结点的总数。然后,你循环遍历根结点的ChildNodes集合。在每一次遍历中,你都会创建一个新的TreeNode类的实例并且在它的构造器中指定它的标题和url。然后,你把这个TreeNode添加到TreeView的Nodes集合中。然后,你检查是否当前SiteMapNode有任何子结点。如果有,你就对之进行遍历,重复TreeNode创建过程。注意,这一次你把新的TreeNodes添加到当前TreeNode对象的ChildNodes集合中。

  注意,因为你知道只存在两级的嵌套,所以你在循环中使用了2。为了使得你的逻辑更具有一般性,你可以使用递归来填充TreeView。

  运行Web表单,那么你将再次看到类似于图8所示的内容。

>>>> 进入论坛交流 <<<<