分享
 
 
 

ASP.NET - SiteMapPath Web 服务器控件概述

王朝学院·作者佚名  2009-12-19
窄屏简体版  字體: |||超大  

SiteMapPath 控件包含来自站点地图的导航数据。此数据包括有关网站中的页的信息,如 URL、标题、说明和导航层次结构中的位置。若将导航数据存储在一个地方,则可以更方便地在网站的导航菜单中添加和删除项。

下面的代码示例演示包含在 Web.sitemap 文件中的站点地图数据。

<siteMap>

<siteMapNode title="Home" description="Home" url="~/default.aspx" >

<siteMapNode title="Services" description="Services we offer"

url="~/Services.aspx">

<siteMapNode title="Training" description="Training classes"

url="~/Training.aspx" />

<siteMapNode title="Consulting" description="Consulting services"

url="~/Consulting.aspx" />

</siteMapNode>

</siteMapNode>

</siteMap>

说明: 只有在站点地图中列出的页才能在 SiteMapPath 控件中显示导航数据。如果将 SiteMapPath 控件放置在站点地图中未列出的页上,该控件将不会向客户端显示任何信息。

通过添加下面的代码,可以向 Training.aspx 页添加 SiteMapPath 控件。

<asp:SiteMapPath ID="SiteMapPath1" Runat="server"></asp:SiteMapPath>

当在浏览器中查看 Training.aspx 页时,SiteMapPath 控件将显示如下类似信息,并以超链接的形式呈现“主页”和“服务”:

主页 > 服务 > 培训

使用 SiteMapPath 控件无需代码和绑定数据就能创建站点导航。此控件可自动读取和呈现站点地图信息。但如果需要,您也可以使用 SiteMapPath 控件来更改站点地图数据。有关更多信息,请参见如何:以编程方式修改内存中的站点地图节点。

SiteMapPath 控件使用户能够向后导航 -- 从当前页到站点层次结构中更高层的页。但是,SiteMapPath 控件不让用户向前导航 -- 从当前页到站点层次结构中较低层的页。例如,可以在新闻组或者留言板应用程序中使用 SiteMapPath 控件,使用户能查看当前浏览的文章的路径。

一、SiteMapPath 类

SiteMapPath 控件是一种站点导航控件,反映 SiteMap 对象提供的数据。它提供了一种用于轻松定位站点的节省空间方式,用作当前显示页在站点中位置的引用点。此种类型的控件通常称为面包屑或眉毛,因为它显示了超链接页名称的分层路径,从而提供了从当前位置沿页层次结构向上的跳转。SiteMapDataSource。SiteMapPath 对于分层页结构较深的站点很有用,在此类站点中 TreeView 或 Menu 可能需要较多的页空间。

SiteMapPath 控件直接使用网站的站点地图数据。如果将其用在未在站点地图中表示的页面上,则其不会显示。有关站点地图的更多信息,请参见 ASP.NET 站点导航概述。

SiteMapPath 由节点组成。路径中的每个元素均称为节点,用 SiteMapNodeItem 对象表示。锚定路径并表示分层树的根的节点称为根节点。表示当前显示页的节点称为当前节点。当前节点与根节点之间的任何其他节点都为父节点。下表描述了三种不同的节点类型。

节点类型

说明

根节点

锚定节点分层组的节点。

父节点

有一个或多个子节点但不是当前节点的节点。

当前节点

表示当前显示页的节点。

SiteMapPath 显示的每个节点都是 HyperLink 或 Literal 控件,您可以将模板或样式应用到这两种控件。对节点应用模板和样式需遵循两个优先级规则:

·如果为节点定义了模板,它会重写为节点定义的样式。

·特定于节点类型的模板和样式会重写为所有节点定义的常规模板和样式。

NodeStyle 和 NodeTemplate 属性适用于所有节点,而不考虑节点类型。如果同时定义了这两个属性,将优先使用 NodeTemplate。

CurrentNodeTemplate 和 CurrentNodeStyle 属性适用于表示当前显示页的节点。如果除了 CurrentNodeTemplate 外,还定义了 NodeTemplate,则将忽略它。如果除了 CurrentNodeStyle 外,还定义了 NodeStyle,则它将与 CurrentNodeStyle 合并,从而创建合并样式。此合并样式使用 CurrentNodeStyle 的所有元素,以及 NodeStyle 中不与 CurrentNodeStyle 冲突的任何附加元素。

RootNodeTemplate 和 RootNodeStyle 属性适用于表示站点导航层次结构根的节点。如果除了 RootNodeTemplate 外,还定义了 NodeTemplate,则将忽略它。如果除了 RootNodeStyle 外,还定义了 NodeStyle,则它将与 RootNodeStyle 合并,从而创建合并样式。此合并样式使用 RootNodeStyle 的所有元素,以及 NodeStyle 中不与 CurrentNodeStyle 冲突的任何附加元素。最后,如果当前显示页是该站点的根页,将使用 RootNodeTemplate 和 RootNodeStyle,而不是 CurrentNodeTemplate 或 CurrentNodeStyle。

SiteMapPath 控件将由 SiteMapProvider 属性标识的站点地图提供程序用作站点导航信息的数据源。如果未指定提供程序,它将使用站点的默认提供程序,此提供程序由 SiteMap..::.Provider 属性标识。通常,这是 ASP.NET 默认站点地图提供程序(即 XmlSiteMapProvider)的一个实例。如果在站点内使用了 SiteMapPath 控件,但未配置站点地图提供程序,该控件将引发 HttpException 异常。

SiteMapPath 控件还提供多个您可以对其进行编程的事件。这使您可以在每次发生事件时都运行一个自定义例程。下表列出了 SiteMapPath 控件支持的事件。

事件

说明

ItemCreated

SiteMapPath 控件先创建一个 SiteMapNodeItem,然后将其与 SiteMapNode 关联时发生。

ItemDataBound

将 SiteMapNodeItem 绑定到 SiteMapNode 包含的站点地图数据时发生。

派生自 SiteMapPath 的类会重写 InitializeItem 方法,以自定义导航控件包含的 SiteMapNodeItem 控件。为了完全控制 SiteMapNodeItem 对象的创建方式以及将其添加到 SiteMapPath 的方式,派生类会重写 CreateControlHierarchy 方法。

示例

下面的代码示例在 Web 窗体页中以声明方式使用了 SiteMapPath 控件。此示例演示一些优先级规则,这些规则控制了将模板和样式应用到 SiteMapPath 节点的顺序。

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html >

<head runat="server">

<title>ASP.NET Example</title>

</head>

<body>

<form id="form1" runat="server">

<!-- The following example demonstrates some of the orders

of precedence when applying styles and templates to

functional nodes of a SiteMapPath.

The NodeStyle and RootNodeStyle define the same attributes,

but are different and conflict with each other: the

RootNodeStyle supersedes NodeStyle, and is the style

rendered. Notice, however, that the underline style

defined by NodeStyle is still applied.

Both a CurrentNodeStyle and a CurrentNodeTemplate are

defined. A template supersedes a style for a node

type, so CurrentNodeTemplate is displayed and CurrentNodeStyle

is ignored. -->

<asp:SiteMapPath ID="SiteMapPath1" runat="server"

RenderCurrentNodeAsLink="true"

NodeStyle-Font-Names="Franklin Gothic Medium"

NodeStyle-Font-Underline="true"

NodeStyle-Font-Bold="true"

RootNodeStyle-Font-Names="Symbol"

RootNodeStyle-Font-Bold="false"

CurrentNodeStyle-Font-Names="Verdana"

CurrentNodeStyle-Font-Size="10pt"

CurrentNodeStyle-Font-Bold="true"

CurrentNodeStyle-ForeColor="red"

CurrentNodeStyle-Font-Underline="false">

<CURRENTNODETEMPLATE>

<asp:Image id="Image1" runat="server" ImageUrl="WebForm2.jpg" AlternateText="WebForm2"/>

</CURRENTNODETEMPLATE>

</asp:SiteMapPath>

</form>

</body>

</html>

上一个示例使用了默认的站点地图提供程序,以及具有如下结构的 Web.sitemap 文件。

<siteMap>

<siteMapNode title="WebForm1" description="WebForm1" url="WebForm1.aspx" >

<siteMapNode title="WebForm2" description="WebForm2" url="WebForm2.aspx"/>

</siteMapNode>

</siteMap>

下面的代码示例演示如何通过重写 InitializeItem 方法,扩展 SiteMapPath 控件并向其添加新功能。DropDownSiteMapPath 控件在当前节点后添加一个 DropDownList,使得定位到当前页的子节点页面变得容易。此示例演示如何在创建项后使用 SiteMapNodeItem 对象,包括检查它们的 SiteMapNodeItemType 及调用 OnItemCreated 方法。

using System;

using System.Collections;

using System.ComponentModel;

using System.Security.Permissions;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

// The DropDownNavigationPath is a class that extends the SiteMapPath

// control and renders a DropDownList after the CurrentNode. The

// DropDownList displays a list of pages found further down the site map

// hierarchy from the current one. Selecting an item in the DropDownList

// redirects to that page.

//

// For simplicity, the DropDownNavigationPath assumes the

// RootToCurrent PathDirection, and does not apply styles

// or templates the current node.

//

[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]

public class DropDownNavigationPath : SiteMapPath {

// Override the InitializeItem method to add a PathSeparator

// and DropDownList to the current node.

protected override void InitializeItem(SiteMapNodeItem item) {

// The only node that must be handled is the CurrentNode.

if (item.ItemType == SiteMapNodeItemType.Current)

{

HyperLink hLink = new HyperLink();

// No Theming for the HyperLink.

hLink.EnableTheming = false;

// Enable the link of the SiteMapPath is enabled.

hLink.Enabled = this.Enabled;

// Set the properties of the HyperLink to

// match those of the corresponding SiteMapNode.

hLink.NavigateUrl = item.SiteMapNode.Url;

hLink.Text = item.SiteMapNode.Title;

if (ShowToolTips) {

hLink.ToolTip = item.SiteMapNode.Description;

}

// Apply styles or templates to the HyperLink here.

// ...

// ...

// Add the item to the Controls collection.

item.Controls.Add(hLink);

AddDropDownListAfterCurrentNode(item);

}

else {

base.InitializeItem(item);

}

}

private void AddDropDownListAfterCurrentNode(SiteMapNodeItem item) {

SiteMapNodeCollection childNodes = item.SiteMapNode.ChildNodes;

// Only do this work if there are child nodes.

if (childNodes != null) {

// Add another PathSeparator after the CurrentNode.

SiteMapNodeItem finalSeparator =

new SiteMapNodeItem(item.ItemIndex,

SiteMapNodeItemType.PathSeparator);

SiteMapNodeItemEventArgs eventArgs =

new SiteMapNodeItemEventArgs(finalSeparator);

InitializeItem(finalSeparator);

// Call OnItemCreated every time a SiteMapNodeItem is

// created and initialized.

OnItemCreated(eventArgs);

// The pathSeparator does not bind to any SiteMapNode, so

// do not call DataBind on the SiteMapNodeItem.

item.Controls.Add(finalSeparator);

// Create a DropDownList and populate it with the children of the

// CurrentNode. There are no styles or templates that are applied

// to the DropDownList control. If OnSelectedIndexChanged is raised,

// the event handler redirects to the page selected.

// The CurrentNode has child nodes.

DropDownList ddList = new DropDownList();

ddList.AutoPostBack = true;

ddList.SelectedIndexChanged += new EventHandler(this.DropDownNavPathEventHandler);

// Add a ListItem to the DropDownList for every node in the

// SiteMapNodes collection.

foreach (SiteMapNode node in childNodes) {

ddList.Items.Add(new ListItem(node.Title, node.Url));

}

item.Controls.Add(ddList);

}

}

// The sender is the DropDownList.

private void DropDownNavPathEventHandler(object sender,EventArgs e) {

DropDownList ddL = sender as DropDownList;

// Redirect to the page the user chose.

if (Context != null)

Context.Response.Redirect(ddL.SelectedValue);

}

}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dodream/archive/2009/12/18/5029754.aspx

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有