原文:返璞归真 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 - 所请求的路由的相关信息
         */         public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new MyHttpHandler(requestContext);
        }
    }     /**//// <summary>
    /// 自定义的 http 处理程序,由路由决定使用哪个 http 处理程序
    /// </summary>
    public class MyHttpHandler : IHttpHandler
    {
        public RequestContext RequestContext { get; private set; }
        
        public MyHttpHandler(RequestContext context)
        {
            RequestContext = context;
        }         public 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;
        public RouteHandlerFactory(string name)
        {
            _name = name;
        }         public 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
    {
        public XXXHttpHandler()
        {         }         public 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
    {
        public 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
            );
        }         protected 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

[源码下载]

返璞归真 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】"[A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 ..."的解决办法

    1.错误页面: “/”应用程序中的服务器错误. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]System.Web ...

  3. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  4. 返璞归真 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 ...

  5. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  6. 返璞归真 asp.net mvc (4) - View/ViewEngine

    原文:返璞归真 asp.net mvc (4) - View/ViewEngine [索引页] [源码下载] 返璞归真 asp.net mvc (4) - View/ViewEngine 作者:web ...

  7. 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

    原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...

  8. 返璞归真 asp.net mvc (3) - Controller/Action

    原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...

  9. 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性

    原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 [索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 ...

随机推荐

  1. 一则简单演示样例看Oracle的“无私”健壮性

    Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  2. 2015年十大热门Android开源新项目

    2015年十大热门Android开源新项目 2015 即将结束,又到了大家喜闻乐见的年终盘点时刻啦,今天给大家盘点一下 2015 年 Android 开发领域新出现的 10 大热门开源项目.数据来自于 ...

  3. SPOJ DISUBSTR(后缀数组)

    传送门:DISUBSTR 题意:给定一个字符串,求不相同的子串. 分析:对于每个sa[i]贡献n-a[i]个后缀,然后减去a[i]与a[i-1]的公共前缀height[i],则每个a[i]贡献n-sa ...

  4. ACM起步要点总结(转哈工大)

    首先,我想说的就是,我是一个很普通的ACMer,高中没有参加过任何计算机和数学竞赛的经历,也没有ben那样过人的天资,努力至今也未能取得什么成绩,我之所以写下这篇文章,只是希望给刚进大学或者刚进ACM ...

  5. php 双向队列类

    (deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构.双向队列中的元素能够从两端弹出,其限定插入和删除操作在表的两端进行. 在实际使用中,还能够有输出受限的双向队 ...

  6. sql优化-提防错误关联

    在写sql时,在多表关联时,有时候容易把关联关系写错.一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了.今天写了一个脚本,碰到该问题了. 第一版本的脚本如下: select ...

  7. SpringMVC与Mybatis框架整合遇到的坑(转)

    最近在做springmvc与mybatis的项目,遇到一些比较坑的问题.花了许多时间却发现其实解决的办法很简单.这里主要是讲我自己在整合这两个框架的时候遇到的一些问题做一个整理.希望遇到和我同样问题的 ...

  8. BGP的状态机制

    Idle 状态:即空闲状态,不接受任何BGP的连接,等待Start事件的产生,如果有start事件产生,若有start事件产生,系统开启ConnectRetry定时器,向邻居发起TCP连接,并将状态变 ...

  9. hdu4614(线段树+二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意:给定一个区间[0,N-1],初始时每个位置上的数字都是0,可以对其进行以下两种操作: 1. ...

  10. poj Budget

    Budget 建图好题.不知道为什么提交一直TLE. 然后.该了几次,看了别人的普通网络流都过了. 我觉得可能是卡DINIC的某些部分吧.这题就是一道普通的上下界最小流. 建图麻烦,所以说一下建图吧. ...