这几天闲来无事,就在园子里找前辈们关于ASP.NET站点导航的东西,找了好半天,不过颇有收获,呵呵!但是我想先把我自己看到的关于ASP.NET站点导航控件的知识摘抄下来,以备后用:
您可以使用 ASP.NET 站点导航功能为用户导航站点提供一致的方法。随着站点内容的增加以及您在站点内来回移动网页,管理所有的链接可能会变得比较困难。ASP.NET 站点导航使您能够将指向所有页面的链接存储在一个中央位置,并在列表中呈现这些链接,或用一个特定 Web 服务器控件在每页上呈现导航菜单。
若要为站点创建一致的、容易管理的导航解决方案,可以使用 ASP.NET 站点导航。ASP.NET 站点导航提供下列功能:
-
站点地图 您可以使用站点地图描述站点的逻辑结构。接着,可通过在添加或移除页面时修改站点地图(而不是修改所有网页的超链接)来管理页导航。
-
ASP.NET 控件 您可以使用 ASP.NET 控件在网页上显示导航菜单。导航菜单以站点地图为基础。
-
编程控件 您可以以代码方式使用 ASP.NET 站点导航,以创建自定义导航控件或修改在导航菜单中显示的信息的位置。
-
访问规则 您可以配置用于在导航菜单中显示或隐藏链接的访问规则。
-
自定义站点地图提供程序 您可以创建自定义站点地图提供程序,以便使用自己的站点地图后端(如存储链接信息的数据库),并将提供程序插入到 ASP.NET 站点导航系统。
站点导航如何工作
通过 ASP.NET 站点导航,可以按层次结构描述站点的布局。例如,一家虚拟在线计算机商店的站点共有八页,其布局如下。
Home
Products
Hardware
Software
Services
Training
Consulting
Support
若要使用站点导航,请先创建一个站点地图或站点的表示形式。您可以用 XML 文件描述站点的层次结构,但也可以使用其他方法。有关更多信息及示例,请参见 ASP.NET 站点地图。
在创建站点地图后,可以使用站点导航控件在 ASP.NET 页上显示导航结构。有关示例,请参见如何:添加简单的站点导航。
站点地图加载进程
默认的 ASP.NET 站点地图提供程序会加载站点地图数据作为 XML 文档,并在应用程序启动时将其作为静态数据进行缓存。超大型站点地图文件在加载时可能要占用大量的内存和 CPU 资源。ASP.NET 站点导航功能根据文件通知来使导航数据保持为最新的。更改站点地图文件时,ASP.NET 会重新加载站点地图数据。请确保将所有病毒扫描软件配置为不会修改站点地图文件。有关更多信息,请参见保证 ASP.NET 站点导航的安全。
站点导航控件
创建一个反映站点结构的站点地图只完成了 ASP.NET 站点导航系统的一部分。导航系统的另一部分是在 ASP.NET 网页中显示导航结构,这样用户就可以在站点内轻松地移动。通过使用下列 ASP.NET 站点导航控件,您可以轻松地在页面中建立导航信息:
-
SiteMapPath 此控件显示导航路径(也称为面包屑或眉毛链接)向用户显示当前页面的位置,并以链接的形式显示返回主页的路径。此控件提供了许多可供自定义链接的外观的选项。
-
TreeView 此控件显示一个树状结构或菜单,让用户可以遍历访问站点中的不同页面。单击包含子节点的节点可将其展开或折叠。
-
Menu 此控件显示一个可展开的菜单,让用户可以遍历访问站点中的不同页面。将光标悬停在菜单上时,将展开包含子节点的节点。
如果在上述示例中将 SiteMapPath 控件添加到在线计算机商店的“Training”(培训)页中,SiteMapPath 控件将显示如下内容,其中“Home”(主页)和“Services”(服务)呈现为超链接的形式:
主页 > 服务 > 培训
您可以使用 SiteMapPath 控件创建站点导航,既不用编写代码,也不用显式绑定数据。此控件可自动读取和呈现站点地图信息。但是,如果需要,也可以使用代码自定义 SiteMapPath 控件。有关示例,请参见如何:以编程方式修改内存中的站点地图节点。
SiteMapPath 控件使用户能够从当前页导航回站点层次结构中较高的页。但是,SiteMapPath 控件不允许从当前页向前导航到层次结构中较深的其他页面。在新闻组或留言板应用程序中,当用户想要查看他们正在浏览的文章的路径时,就可以使用 SiteMapPath 控件。
通过 TreeView 或 Menu 控件,用户可以打开节点并直接导航到特定的页。这些控件不会像 SiteMapPath 控件那样直接读取站点地图。相反,您需要在页上添加一个可读取站点地图的 SiteMapDataSource 控件。然后,将 TreeView 或 Menu 控件绑定到 SiteMapDataSource 控件,从而将站点地图呈现在该页上。TreeView 控件将显示如下的类似内容:
- Home
- Services
+ 培训
注意:
在站点中的所有页上显示 SiteMapPath、TreeView 或 Menu 控件有一个简便方法,就是先创建一个母版页,然后将这些控件添加到该页上。有关更多信息,请参见 ASP.NET 母版页概述。
站点导航 API
通过导航控件,您只需编写极少的代码甚至不需要代码,就可以在页面中添加站点导航;不过您也能以编程的方式处理站点导航。当 Web 应用程序运行时,ASP.NET 公开一个反映站点地图结构的 SiteMap 对象。SiteMap 对象的所有成员均为静态成员。而 SiteMap 对象会公开 SiteMapNode 对象的集合,这些对象包含地图中每个节点的属性。(在使用 SiteMapPath 控件时,该控件会使用 SiteMap 和 SiteMapNode 对象自动呈现相应的链接。
SiteMapNode 对象表示站点地图结构中的一个网站页面。SiteMapNode 对象由静态 SiteMap 类使用一个或多个站点地图提供程序在运行时加载,从而将站点地图数据从永久存储区加载到内存中。SiteMapNode 对象由 SiteMapNodeItem 类包装以供 Web 服务器控件(如 SiteMapPath 控件)使用。
SiteMapNode 类包括几个用于描述网站中单个页(包括某一页)的属性,如 Url、Title 和 Description 属性; 而 Url 属性由作为 ASP.NET 默认站点地图提供程序的 XmlSiteMapProvider 类使用,该类将这一属性作为内部集合的查找键,提供程序用这个查找键来跟踪节点。SiteMapNode 类支持一个基本的 Key 属性,站点地图提供程序使用该属性来跟踪节点。此外,Url 属性还由导航控件使用,以便呈现导航结构中页面的超链接。Title 属性是 SiteMapNode 的友好名称,通常与 Web 窗体的 HTML 标题相同,并由导航控件用于呈现简单的标签。最后,附加 Attributes 属性的 NameValueCollection 集合可供某些站点地图提供程序使用,这些提供程序使用 SiteMapNode 对象,但需要 SiteMapNode 基类中未提供的附加属性。
您可以在自己的代码中使用 SiteMap、SiteMapNode 和 SiteMapProvider 对象来遍历站点地图结构,或创建自定义的控件来显示站点地图数据。您不能向站点地图进行写入,但可以在对象的实例中修改站点地图节点。有关更多信息,请参见如何:以编程方式修改内存中的站点地图节点或如何:以编程方式枚举站点地图节点。
即需填充 TreeNode 数据
静态定义数据结构有时是不可行的,或者数据可能会依赖运行时收集的信息。为了动态显示数据,TreeView 控件支持动态节点填充。将 TreeView 控件配置为即需填充时,该控件将在用户展开节点时引发事件。事件处理程序检索相应数据,然后填充到用户单击的节点。若要以数据即需填充 TreeNode 对象,请将节点的 PopulateOnDemand 属性设置为 true,并创建 TreeNodePopulate 事件处理程序以向 TreeNode 对象中填充数据。
客户端 TreeView 节点填充
任何在浏览器功能配置文件中将 SupportsCallback 属性设置为 true 的浏览器都支持客户端节点填充。
借助客户端节点填充,TreeView 控件可以通过从客户端脚本中调用服务器的 TreeNodePopulate 事件来填充节点,而无需完全回发至服务器。有关客户端节点填充的更多信息,请参见 PopulateNodesFromClient。
启用客户端脚本
默认情况下,在高级 (Up-level) 浏览器中,TreeView 控件上的节点的展开 - 折叠功能是使用客户端脚本执行的。由于控件不需要回发至服务器来呈现新配置,所以使用客户端脚本可以提高呈现的效率。
注意:
如果浏览器中的客户端脚本被禁用或浏览器不支持客户端脚本,则 TreeView 控件将恢复到低级(Down-level)模式并在每次用户单击节点时回发到服务器。
TreeView 回发
默认情况下,除非浏览器不支持客户端脚本或者 EnableClientScript 属性被设置为 false,否则 TreeView 控件将在客户端处理展开 - 折叠功能。如果 PopulateNodesFromClient 属性被设置为 true 并且浏览器支持客户端脚本,那么 TreeView 控件将从服务器检索数据,而不回发整页。
当 TreeView 控件处于选择模式时,每次用户单击节点时都将回发到服务器并引发 SelectedNodeChanged 事件。
通常,您应该在 TreeView 控件处于选择模式或正在动态填充节点时处理回发事件。原因是 PopulateOnDemand 或 PopulateNodesFromClient 属性已设置为 true。
将 TreeView 控件与 UpdatePanel 控件一起使用
UpdatePanel 控件用于通过回发更新页面的选定区域,而不是更新整个页面。可在 UpdatePanel 控件内使用 TreeView 控件,但具有以下限制:
-
TreeView 回调必须与异步回发关联,否则回调事件验证将会失败。在将 TreeNode 控件的 PopulateOnDemand 属性设置为 true 时,即启用了回调。可以使用以下方法之一来确保 TreeView 回调对 UpdatePanel 控件起作用:
-
如果 TreeView 控件不在 UpdatePanel 控件内,则在不是异步回发的一部分的 TreeNode 控件上禁用回调。为此,需要将 PopulateOnDemand 属性设置为 false。
-
以编程方式刷新在异步回发过程中注册回调的所有控件。例如,可以将 TreeView 控件放置在 UpdatePanel 控件内。TreeView 控件不必位于发起异步回发的 UpdatePanel 控件中,只要包含 TreeView 控件的 UpdatePanel 控件刷新即可。
-
-
必须使用对级联样式表 (CSS) 类的引用来应用样式。例如,使用属性-CssClass(其中属性指 Property)属性 (Attribute) 来设置样式,而不是使用属性-子属性(其中属性指 Property)属性 (Attribute) 设置 NodeStyle 属性 (Property)。同样,在使用 NodeStyle 模板设置样式时,请使用模板的 CssClass 属性 (Attribute)。
-
EnableClientScript 属性必须为 true(默认值)。此外,如果对 TreeView 控件启用了回调,则不能在异步回发之间更改 EnableClientScript 属性。
有关使用 UpdatePanel 控件的更多信息,请参见 UpdatePanel 控件概述和部分页呈现概述。
站点导航组件之间的关系
下面的示意图演示了各个 ASP.NET 站点导航组件之间的关系。
这几天闲来无事,就在园子里找前辈们关于ASP.NET站点导航的东西,找了好半天,不过颇有收获,呵呵!但是我想先把我自己看到的关于ASP.NET站点导航控件的知识摘抄下来,以备后用:
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 方法。
下面的代码示例演示如何通过重写 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);
}
}
Web.sitemap和Web.config中的Role节点:
1、只有角色为2的用户才能看到这个节点
<siteMapNode title="Parent1_Child1" url="~/Parent1/Parent1_Child1.aspx" roles="2"/>
2、只有角色为1或2的用户才能操作这个文件夹中的文件
<location path="Parent2">
<system.web>
<authorization>
<allow roles="1,2" />
<deny users="*" />
</authorization>
</system.web>
</location>
比如,当会员登陆后,他的个人界面有一个菜单,菜单中有所有可以看到的功能,但是有些功能他必须付费后才能使用,那么就必须设置roles属性了。