[索引页]
[×××]

返璞归真 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 { get; private set; }
                
MyHttpHandler() MyHttpHandler(RequestContext context)
                {
                        RequestContext = context;
                }

void Proce***equest() void Proce***equest(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 Proce***equest() void Proce***equest(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        
// 不要勾选“确认文件是否存在”

OK
[×××]

转载于:https://blog.51cto.com/webabcd/341116

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

  1. ASP.net 的URL路由选择(System.Web.Routing.dll)

    System.Web.Routing是.net 3.5sp1中新增的一个dll,用它提拱的类可以很方便的实现url的映射,在asp.net WebFrom的编程中可以使客户端请求的URL变得更加的&q ...

  2. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  3. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  4. ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)

    我 从事专业开发迄今为止已有 15 年,在此之前,我利用业余时间从事开发至少也有 10 年了.与我这一代的大多数人一样,我是从 8 位计算机起步,然后转用 PC 平台的.随着计算机的复杂性日益增加,我 ...

  5. ASP.NET MVC的路由

    好久没写博文了,感觉最近好像少了点动力.唉!这回就看看这个MVC的路由. 说这个路由机制其实不是MVC里面特有的,ASP.NET里面本身就有的,只不过在WebForm里面一般比较少用,而在MVC里就是 ...

  6. asp.net mvc 伪静态路由配置

    asp.net mvc实现伪静态路由必须按如下方式设置好,才能访问 .htm 或者.html页面 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspne ...

  7. 【ASP.NET MVC】 路由机制:命名路由

    首先看一下命名路由和没有命名的差别: 命名路由: routes.MapRoute(name: "Test", // Route nameurl: "code/p/{act ...

  8. asp:boundfield html,BoundField 类 (System.Web.UI.WebControls) | Microsoft Docs

    BoundField 类 定义 表示数据绑定控件中以文本形式显示的字段.Represents a field that is displayed as text in a data-bound con ...

  9. c#进阶(2)—— ASP.NET MVC 常用路由总结

    1.URL模式 路由系统用一组路由来实现它的功能,这些路由共同组成了应用系统URL架构或方案,这种URL架构是应用程序能够识别并能对之做出响应的一组URL,当处理一个输入 请求时,路由系统的工作是将这 ...

最新文章

  1. 解决事件多次绑定,执行多次问题
  2. C++ Primer 5th笔记(6)chapter6 函数: 参数
  3. C++Quick sort快速排序的实现算法之二(附完整源码)
  4. tab切换-自动、点击、内容变换
  5. Tomcat 比 nio 、aio性能更好的apr介绍
  6. Postfix疯狂外发垃圾邮件之分析与解决
  7. matlab设计模拟高通滤波器
  8. 进程与线程的四个区别
  9. jvisualvm工具
  10. MVC学习笔记:MVC实现用户登录验证ActionFilterAttribute用法并实现统一授权
  11. 2018.10.24-day3 python总结
  12. 《Excel与VBA程序设计》第四章新鲜出炉
  13. Atitit pg10分区 总结 1.1. create table tmp_log (  1 1.2. -创建索引 1 1.3. 查看表 in pgadmin4 2 2. 二 分区表管理 2 2.1
  14. centos 安装mysql5.6.22_CentOS 6.4 安装MySQL 5.6.22
  15. 中南大学计算机学院伍逸凡,关于公布2017年湖南省大学生力学竞赛等15项学科竞赛结果的通知...
  16. TRC文件转ASC文件
  17. 计算机启动项在什么地方找,如何查看电脑开机启动项_系统开机启动项快捷键 - 学无忧...
  18. 寒武纪加速平台(MLU200系列) 摸鱼指南(一)--- 基本概念及相关介绍
  19. excel shell合成_1分钟拆解:「如何将10多个工作表sheet,合并成一张?」
  20. 页面布局常用,让子级div排排坐

热门文章

  1. (紀錄)[ASP.NET MVC][jQuery]-1 純手工打造屬於自己的 jQuery GridView
  2. 华为eNSP和SecureCRT连接乱码问题
  3. backtrack笔记本无法用Fn调亮度
  4. vsftp 550,227 报错解决
  5. 教你怎样快速DIY自己的博客园SKIN
  6. 边缘计算 — 边缘网络
  7. Tungsten Fabric SDN — 报文转发流程
  8. FaaS — Serverless Computing(无服务器计算)
  9. 5GS 协议栈 — PFCP 协议 — MAR 多接入规则
  10. Kubernetes — 容器与镜像