Asp.Net 4中使用路由时使用SiteMap

简介:

 在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 asSystem.Web.UI.Page;

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

                    {

                        var handler = page.RouteData.RouteHandler asPageRouteHandler;

                        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 += newSiteMapResolveEventHandler(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.SiteMapNodecurrentNode)

        {

            if (currentNode == null)

                return currentNode;

          

            var page = HttpContext.Current.CurrentHandler asSystem.Web.UI.Page;

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

            {

                Dictionary<Regexstring> replacements = newDictionary<System.Text.RegularExpressions.Regexstring>();

                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.0encoding="utf-8" ?>

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

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

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

    <siteMapNode url="/show.aspxtitle="Show" description="" />

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

 </siteMapNode>

</siteMap>

 

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

 

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



    本文转自风车车  博客园博客,原文链接:http://www.cnblogs.com/xray2005/archive/2011/07/04/2097840.html,如需转载请自行联系原作者



相关文章
|
开发框架 .NET 定位技术
asp.net core3.1 c# 生成三种sitemap
asp.net core3.1 c# 生成三种sitemap
78 0
|
开发框架 前端开发 .NET
ASP.NET Core MVC 从入门到精通之路由
ASP.NET Core MVC 从入门到精通之路由
238 0
|
开发框架 Dubbo 中间件
【愚公系列】2022年03月 ASP.NET Core中间件-条件路由
【愚公系列】2022年03月 ASP.NET Core中间件-条件路由
188 32
|
开发框架 前端开发 中间件
ASP.NET Core端点路由 作用原理
端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民。
ASP.NET Core端点路由 作用原理
|
存储 开发框架 中间件
ASP.NET Core : 十六.扒一扒新的Endpoint路由方案(下)
ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大,但从内部运行方式上来说,差别还是很大的。上一篇详细介绍了原版路由方案的运行机制,本文仍然通过一幅图来了解一下新版的运行机制,最后再总结一下二者的异同点。
408 0
ASP.NET Core : 十六.扒一扒新的Endpoint路由方案(下)
|
存储 开发框架 中间件
ASP.NET Core : 十六.扒一扒新的Endpoint路由方案(上)
ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不大,但从内部运行方式上来说,差别还是很大的。上一篇详细介绍了原版路由方案的运行机制,本文仍然通过一幅图来了解一下新版的运行机制,最后再总结一下二者的异同点。
411 0
ASP.NET Core : 十六.扒一扒新的Endpoint路由方案(上)
|
开发框架 中间件 .NET
ASP.NET Core : 十五.图解路由(2.1 or earler)
本文通过一张图来看一下路由的配置以及请求处理的机制。
175 0
ASP.NET Core : 十五.图解路由(2.1 or earler)
|
开发框架 前端开发 .NET
ASP.NET Core端点路由中三种让人困惑的路由函数
早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和路由,其核心目的是将请求落地点与路由寻址方式解耦。
|
开发框架 前端开发 .NET
ASP.NET Core中三个egg疼的路由函数
ASP.NET Core中三个egg疼的路由函数
258 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
193 7