博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.Net 4中使用路由时使用SiteMap
阅读量:4599 次
发布时间:2019-06-09

本文共 2800 字,大约阅读时间需要 9 分钟。

    在ASP.net 4中使用路由新特性时,发现是无法使用默认的SiteMapPath控件的,不起作用.后来终于找到提供一个自定义的SiteMapProvider,从而使得在使用路由规则的页面中可以使用SiteMap.过程如下:

1.         环境准备

Window7(IIS7.5)+VS2010.

2.         首先实现一个自定义的SiteMapProvider,继承自XmlSiteMapProvider,代码如下:

public class RouteSiteMapProvider : XmlSiteMapProvider

    {

      

 public override SiteMapNode CurrentNode

        {

            get

            {

               

                var node = base.CurrentNode;

                if (node == null)

                {

                    var page = HttpContext.Current.CurrentHandler as System.Web.UI.Page;

                    if (page != null && page.RouteData != null)

                    {

                        var handler = page.RouteData.RouteHandler as PageRouteHandler;

                        if (handler != null)

                        {

                            node = FindSiteMapNode(handler.VirtualPath);

                        }

                    }

                }

                return node;

            }

        }

}

3.         在全局类中的Application_Start事件,增加对SiteMapResolve的事件处理,代码如下.

protected void Application_Start(object sender, EventArgs e)

        {

            RegisteRoutes(RouteTable.Routes);

 

            SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);

        }

其中, SiteMap_SiteMapResolve处理代码如下:

SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)

        {

            return ProcessNode (e.Provider.CurrentNode.Clone(true));

        }

这里使用传递的参数是e.Provider.CurrentNode.Clone(true),因为后续的代码是需要修改SiteMapNode,如果不调用Clone方法,则会出现SiteMapNode只读,无法修改的异常.

接着, Process方法中的代码是根据SiteMapNode参数,进行相应修改.代码如下:

System.Web.SiteMapNode ProcessNode(System.Web.SiteMapNode currentNode)

        {

            if (currentNode == null)

                return currentNode;

          

            var page = HttpContext.Current.CurrentHandler as System.Web.UI.Page;

            if (page != null && page.RouteData != null)

            {

                Dictionary<Regex, string> replacements = new Dictionary<System.Text.RegularExpressions.Regex, string>();

                foreach (var key in page.RouteData.Values.Keys)

                {

                    replacements.Add(new Regex(string.Format("\\{

{
{0}\\}}", key), RegexOptions.IgnoreCase), page.RouteData.Values[key].ToString());

                }

 

                var activeNode = currentNode;

                while (activeNode != null)

                {

                    foreach (var replacement in replacements)

                    {

                        activeNode.Title = replacement.Key.Replace(activeNode.Title, replacement.Value);

 

                    }

                    activeNode = activeNode.ParentNode;

                }

 

            }

            return currentNode;

 

        }

这里,只是修改相应的Title,当然,我们还是进行更多的修改.

4.         接着,修改web.config,增加SiteMapProvider,如下:

<siteMap defaultProvider="RouteSiteMapProvider" >

      <providers >

        <add name="RouteSiteMapProvider" type="WebApplication3.RouteSiteMapProvider" siteMapFile="~/Web.sitemap" />

           </providers>

    </siteMap>

 

6.         然后,项目中一个Web.SiteMap文件,内容如下:

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

 <siteMapNode url="/Default.aspx" title="Asp.Net 4" description="">

    <siteMapNode url="/edit.aspx" title="Edit Items" description="" />

    <siteMapNode url="/show.aspx" title="Show" description="" />

    <siteMapNode url="/Items/Default.aspx" title="Items" description=""/>

 </siteMapNode>

</siteMap>

 

7.        在页面上添加 SiteMapPath控件,然后运行.我们边可以看到相应的SiteMap.

 

8.  最后,点击这里可以下载代码示例.

转载于:https://www.cnblogs.com/xray2005/archive/2011/07/04/2097840.html

你可能感兴趣的文章
不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况...
查看>>
tf Dataset API
查看>>
js中按钮控制显示隐藏以及下拉功能
查看>>
Intent
查看>>
波涛 - 证券期货投资计算机化技术分析原理(2013年3月19日)
查看>>
sqlserver存储过程中sql语句连接及datetime字段的处理
查看>>
JavaScript 测试和捕捉
查看>>
高级软件工程第二次作业——个人项目实战:数独
查看>>
Kafka主要配置
查看>>
PHP开发经验总结
查看>>
Leetcode 400. Nth digits
查看>>
pycharm 中 ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误解决方案背景描述...
查看>>
三次握手 四次回收流程图
查看>>
第四次实验作业
查看>>
挖矿call
查看>>
第二次站立会议1
查看>>
Linux进程调度分析
查看>>
C++布隆过滤器
查看>>
前端优化
查看>>
【转】Javascript 中的false,零值,null,undefined和空字符串对象
查看>>