ASP.NET站点导航应用详解
导航实际上给访问者提供了一个地图类似的东西,让访问者更快地找到想要的东西。
在2.0中引入了一个很重要的概念,那就是站点地图sitemap这样一个xml文件,但是它后缀不是xml。
若要为站点创建一致的、容易管理的导航解决方案,可以使用asp.net站点导航。asp.net站点导航提供下列功能:
在了解了一些基本知识后,我们来做一个简单的导航的例子。
1、首先创建一个master
html代码:
<%@ master language="c#" autoeventwireup="true" codebehind="mp.master.cs" inherits="navigation.mp" %> <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <asp:contentplaceholder id="head" runat="server"> </asp:contentplaceholder> </head> <body> <form id="form1" runat="server"> <div> <table style="width: 656px; height: 255px"> <tr> <td style="width: 500px; background-color: #99ccff"> 您当前的位置在: <asp:sitemappath id="sitemappath1" runat="server" font-names="verdana" font-size="0.8em" pathseparator=" : "> <currentnodestyle forecolor="#333333" /> <nodestyle font-bold="true" forecolor="#990000" /> <pathseparatorstyle font-bold="true" forecolor="#990000" /> <rootnodestyle font-bold="true" forecolor="#ff8000" /> </asp:sitemappath> </td> </tr> <tr> <td style="width: 500px"> <asp:contentplaceholder id="contentplaceholder1" runat="server"> </asp:contentplaceholder> </td> </tr> <tr> <td style="width: 500px; background-color: #ebebff"> 版权所有 。。。。。。。</td> </tr> </table> </div> </form> </body> </html>
显示的效果:
2、建立如下导航结构(统一应用上面的master)
3、添加站点地图(名称不可以改)
web.sitemap下的代码如下:
<?xml version="1.0" encoding="utf-8" ?> <sitemap xmlns="http://schemas.microsoft.com/aspnet/sitemap-file-1.0" > <sitemapnode url="a.aspx" title="首页" description="1"> <sitemapnode url="b.aspx" title="根目录b页" description="2" /> <sitemapnode url="default.aspx" title="default页" description="3" /> <sitemapnode url="" title="one目录" description="4"> <sitemapnode url="~/one/a.aspx" title="one目录下的a" description="5"/> <sitemapnode url="~/one/b.aspx" title="one目录下的b" description="6"/> <sitemapnode url="" title="one目录下的once目录" description="7"> <sitemapnode url="~/one/once/a.aspx" title="one目录下的once目录下的a" description="8"/> <sitemapnode url="~/one/once/b.aspx" title="one目录下的once目录下的b" description="9"/> </sitemapnode> </sitemapnode> <sitemapnode url="" title="two目录" description="10"> <sitemapnode url="~/two/a.aspx" title="two目录下的a" description="11"/> <sitemapnode url="~/two/b.aspx" title="two目录下的b" description="12"/> </sitemapnode> <sitemapnode url="sitemap.aspx" title="动态修改内存中" description="动态修改内存中的站点地图"/> </sitemapnode> </sitemap>
4、在根目录下a.aspx,放一个treeview控件。新建数据源为我们建立的站点地图。
运行后,我们便可以看到效果如图所示:
接下来会讲动态修改内存中的站点地图,什么叫动态修改内存中的站点地图,到底是什么意思呢?
例如文章列表中通常都有多篇,我们总不能把这些都放到站点地图中去,何况文章id、栏目编号、商品分类或者商品id也不是我们事先能够预料到的,那么站点地图里没有,外面就不能显示,该怎么办呢?这就需要用到动态修改内存中的站点地图了。
如上面提出的问题,我们假设有一个文章管理系统结构如下:
首页-新闻-国际新闻(列表)
那么可以假设国际新闻这一级的页面是list.aspx,不同的栏目会有不同的id,那么地址结构就假设如下:
xxx.com--~/news/--list.aspx?id=3&page=12
这样一个结构,我们对新闻列表页的处理就可以只在站点地图中静态地写上url="~/news/list.aspx"。那么如果在别人浏览时呈现出上面的结构呢,我们接下来处理。
web.sitemap:
<?xml version="1.0" encoding="utf-8" ?> <sitemap xmlns="http://schemas.microsoft.com/aspnet/sitemap-file-1.0" > <sitemapnode url="a.aspx" title="首页" description="1"> <sitemapnode url="b.aspx" title="根目录b页" description="2" /> <sitemapnode url="default.aspx" title="default页" description="3" /> <sitemapnode url="" title="one目录" description="4"> <sitemapnode url="~/one/a.aspx" title="one目录下的a" description="5"/> <sitemapnode url="~/one/b.aspx" title="one目录下的b" description="6"/> <sitemapnode url="" title="one目录下的once目录" description="7"> <sitemapnode url="~/one/once/a.aspx" title="one目录下的once目录下的a" description="8"/> <sitemapnode url="~/one/once/b.aspx" title="one目录下的once目录下的b" description="9"/> </sitemapnode> </sitemapnode> <sitemapnode url="" title="two目录" description="10"> <sitemapnode url="~/two/a.aspx" title="two目录下的a" description="11"/> <sitemapnode url="~/two/b.aspx" title="two目录下的b" description="12"/> </sitemapnode> <sitemapnode url="sitemap.aspx" title="动态修改内存中" description="动态修改内存中的站点地图"/> </sitemapnode> </sitemap>
主要就是用到title为动态修改内存中的这一句来演示。
然后在演示页面sitemap.aspx中放一个sitemappath控件,注意设置它的rendercurrentnodeaslink为true(指示当前结点为链接)
页面的后台代码:
using system; using system.collections.generic; using system.linq; using system.web; using system.web.ui; using system.web.ui.webcontrols; namespace navigation { public partial class sitemap : system.web.ui.page { protected void page_load(object sender, eventargs e) { //首先我们在这里注册一个事件,也就是说在访问currentnode属性的时候触发这个事件 sitemap.sitemapresolve+=new sitemapresolveeventhandler(sitemap_sitemapresolve); } sitemapnode sitemap_sitemapresolve(object sender,sitemapresolveeventargs e) { //我们自定义的处理方法 获取并创建当前节点的副本,并同时复制他的上级节点 sitemapnode currentnode = sitemap.currentnode.clone(true); sitemapnode tempnode = currentnode; int id = nid(); int page = npage(); //从下面方法中得到变量 if (id>0) { tempnode.url = tempnode.url + "?id=" + id.tostring(); } if (id>0 && page>=0) { tempnode.url = tempnode.url + "&page=" + page.tostring(); } else if (page>0) { tempnode.url = tempnode.url + "?page=" + page.tostring(); } return tempnode; } //随便设置一个数。 private int nid() { return 3; } private int npage() { return 12; } } }
解释:上面的nid()和npage(),是用来获取参数的两个方法,实际中根据实际情况而定。
运行,我们看看这个链接的属性:
到此,我们就很简单的实现了动态修改内存中的站点地图了!
站点导航,是我们在bs开发中非常常用的,所以我们还是很有必要深刻掌握的,接下来还会发相关的文章,与大家一讨论学习!