返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

简介:
[索引页]
[源码下载]


返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)


作者: webabcd


介绍
System.Web.Routing - 此命名空间提供用于 URL 路由的类,通过该类可以使用不映射到物理文件的 URL
  • IRouteHandler - 路由处理程序接口,自定义的路由处理程序都要实现这个接口
  • RequestContext - 封装所请求的路由的相关信息和当前的 http 上下文信息
  • RouteData - 所请求的路由的相关信息
  • RouteCollection - 路由集合
  • RouteValueDictionary - 不区分大小写的 key/value 字典表
  • Route - 路由的相关信息


示例
1、MyHandler.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Web.Routing; 

namespace MVC.RoutingDemo 

        /**//// <summary> 
        /// 路由处理程序 
        /// </summary> 
         public  class MyRouteHandler : IRouteHandler 
        { 
                /**//* 
                 * IRouteHandler - 路由处理程序接口,自定义的路由处理程序都要实现这个接口    
                 *         该接口有一个方法 IHttpHandler GetHttpHandler(RequestContext requestContext) 
                 *         此方法需要返回一个处理该路由的 http 处理程序 (HttpHandler) 
                 * RequestContext - 封装所请求的路由的相关信息和当前的 http 上下文信息 
                 *         RequestContext.HttpContext - 当前的 http 上下文信息 
                 *         RequestContext.RouteData - 所请求的路由的相关信息 
                 */ 

IHttpHandler GetHttpHandler() IHttpHandler GetHttpHandler(RequestContext requestContext) 
                { 
                        return  new MyHttpHandler(requestContext); 
                } 
        } 

        /**//// <summary> 
        /// 自定义的 http 处理程序,由路由决定使用哪个 http 处理程序 
        /// </summary> 
         public  class MyHttpHandler : IHttpHandler 
        { 
                 public RequestContext RequestContext {  getprivate  set; } 
                 
MyHttpHandler() MyHttpHandler(RequestContext context) 
                { 
                        RequestContext = context; 
                } 

void ProcessRequest() void ProcessRequest(HttpContext httpContext) 
                { 
                        /**//* 
                         * RouteData - 所请求的路由的相关信息 
                         *         RouteData.Values - 一个字典表(key - 路由参数;value - 路由值) 
                         *         RouteData.DataTokens - 自定义需要传递的数据,也是一个字典表 
                         *         RouteData.GetRequiredString( string key) - 获取指定的路由参数所对应的路由值 
                         */ 

                        httpContext.Response.Write( "相关参数为:<br />"); 
                        foreach (var dic  in RequestContext.RouteData.Values) 
                        { 
                                httpContext.Response.Write(dic.Key +  " : " + dic.Value +  "<br />"); 
                        } 

                        httpContext.Response.Write( "相关Token为:<br />"); 
                        foreach (var dic  in RequestContext.RouteData.DataTokens) 
                        { 
                                httpContext.Response.Write(dic.Key +  " : " + dic.Value +  "<br />"); 
                        } 
                } 

                 public bool IsReusable 
                { 
                         get { return  false; } 
                } 
        } 

        /**//// <summary> 
        /// 如果有 n 多的路由处理程序,为了方便调用,减少代码,我们可以将其写成一个 Factory 类,如下: 
        /// </summary> 
         public  class RouteHandlerFactory : IRouteHandler 
        { 
                 private  string _name; 
RouteHandlerFactory() RouteHandlerFactory( string name) 
                { 
                        _name = name; 
                } 

IHttpHandler GetHttpHandler() IHttpHandler GetHttpHandler(RequestContext requestContext) 
                { 
                         if (_name ==  "My"
                                return  new MyHttpHandler(requestContext); 

                        return  new MyHttpHandler(requestContext); 
                } 
        } 

        /**//// <summary> 
        /// 演示不经过路由,根据 web.config 中的 HttpHandler 相关配置,由此 HttpHandler 直接处理相关请球。具体配置见 Global.asax 
        /// </summary> 
         public  class XXXHttpHandler : IHttpHandler 
        { 
XXXHttpHandler() XXXHttpHandler() 
                { 

                } 

void ProcessRequest() void ProcessRequest(HttpContext context) 
                { 
                        context.Response.Write(context.Request.Url.ToString()); 
                } 

                 public bool IsReusable 
                { 
                         get { return  false; } 
                } 
        } 
}
 
2、 Web.config
<?xml version= "1.0"?> 
<configuration> 
    <system.web> 
        <httpHandlers> 

            <!-- 
            配置一个自定义的 HttpHandler,用于处理后缀名为 xxx 的页面 
            如果不需要将 *.xxx 交给路由处理,而是直接让指定的 HttpHandler 处理,请参看 Global.asax 中的配置 
            --> 
            <add verb= "*" path= "*.xxx" type= "MVC.RoutingDemo.XXXHttpHandler" /> 

        </httpHandlers> 
        <httpModules> 
             
            <!-- 
            UrlRoutingModule - 用于匹配 asp.net 应用程序中的路由的 http 请求 
                    该模块找到匹配路由后,会检索 IRouteHandler 对象,以查找该路由,然后从该路由处理程序获取一个 IHttpHandler 对象,并将该对象用作当前请求的 http 处理程序 
            --> 
            <add name= "UrlRoutingModule" type= "System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
             
        </httpModules> 
    </system.web> 
</configuration>
 
3、Global.asax.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace MVC 

        // Note:  For instructions  on enabling IIS6  or IIS7 classic mode,    
        // visit http://go.microsoft.com/?LinkId=9394801 

         public  class MvcApplication : System.Web.HttpApplication 
        { 
static void RegisterRoutes() static void RegisterRoutes(RouteCollection routes) 
                { 
                        /**//* 路由方向:自上而下,查找到匹配的就去处理,而不会继续往下做匹配 */ 

                        /**//* 
                         * RouteCollection - 路由集合 
                         *         RouteCollection.IgnoreRoute() - 指定的地址不由路由处理 
                         *         RouteCollection.Add() - 新增一个路由配置 
                         *         RouteCollection.MapRoute() - 映射一个路由(Add() 方法的简化版,内部会自动调用 MvcRouteHandler) 
                         */ 

                        // .asd 文件不走此路由 
                        routes.IgnoreRoute( "{resource}.axd/{*pathInfo}"); 
                        // .xxx 文件不走此路由 
                        routes.Add( new Route( "{resource}.xxx/{*pathInfo}"new StopRoutingHandler())); 


                        /**//* 
                         * RouteValueDictionary - 不区分大小写的 key/value 字典表 
                         * Route - 路由的相关信息 
                         *         Route.Url - 路由的 url 匹配模式,{ } 内的为需要匹配的路由参数名 
                         *         Route.Defaults - 路由参数的默认值 
                         *         Route.RouteHandler - 路由对应的路由处理程序 
                         *         Route.DataTokens - 自定义需要传递的数据 
                         *         Route.Constraints - 约束参数值的有效性(可以是正则表达式(不区分大小写),也可以是实现了 IRouteConstraint 的对象) 
                         */ 

                        Route route =  new Route( 
                                 "Routing/{parent}/{child}"

                                // RouteValueDictionary - 可以接收一个匿名对象为参数,属性名转换为 key, 属性值转换为 value 
                                 new RouteValueDictionary( new { parent =  "ria", child =  "silverlight", controller =  "Product", action =  "Index" }), 

                                 new RoutingDemo.MyRouteHandler() 
                        ); 
                        route.DataTokens =  new RouteValueDictionary( new { token1 =  "abc", token2 =  "xyz" }); 

                        // HttpMethodConstraint - 实现了 IRouteConstraint 接口的类,用于约束 http 方法 
                        route.Constraints =  new RouteValueDictionary( new { parent =  @"^[a-zA-Z]+$", httpMethod =  new HttpMethodConstraint( "GET") }); 

                        // 将路由添加进路由集合,名称可以随便设置,但必须唯一(也可以不设置路由名称) 
                        routes.Add( "MyRoutingDemo", route); 
                        // routes.Add(route); 


                        // * - 路由也支持通配符 
                        // {*param} - 代表匹配任意值,其中路由参数名为 param 
                        routes.Add( new Route( "Wildcard/{*param}"new RouteValueDictionary( new { controller =  "Product", action =  "Index" }),  new RoutingDemo.MyRouteHandler())); 


                        // MapRoute() 封装了 Add(), MapRoute() 内部会自动调用 MvcRouteHandler 
                        // 其中必须要有 controller 项和 action 项 
                        // 其中设置 namespaces 参数相当于 route.DataTokens[ "Namespaces"] = namespaces; 
                        routes.MapRoute( 
                                 "Products"
                                 "ProductList/{pageIndex}"
                                 new { controller =  "Product", action =  "Index", pageIndex = 0 } 
                        ); 

                        routes.MapRoute( 
                                 "Default",                                                                                            // Route name 
                                 "{controller}/{action}/{id}",                                                     // URL  with parameters 
                                 new { controller =  "Home", action =  "Index", id = "" }    // Parameter defaults 
                        ); 
                } 

void Application_Start() void Application_Start() 
                { 
                        RegisterRoutes(RouteTable.Routes); 

                        // 调试路由(需要 RouteDebug.dll),调用如下语句后,会在每个页面都显示详细的路由信息 
                        // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); 
                } 
        } 



// 部署在 iis 应注意 
// 配置通配符映射程序,类似如下地址 
// C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll        
// 不要勾选“确认文件是否存在”
 
 
 





     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341116 ,如需转载请自行联系原作者

相关文章
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
634 4
|
9月前
|
开发框架 .NET C#
ASP.NET Core Blazor 路由配置和导航
大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
665 6
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
12月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
822 0
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
开发框架 前端开发 .NET
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。
475 6
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
347 3
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
451 3
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
481 7