原文:返璞归真 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. 【MongoDB】The description of index(一)

    From this blog, we start to talk about the index in mongo Database, which is similar to the traditio ...

  2. hdu5001(概率dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5001 题意:一个人随即从一个点出发,到达邻接点的概率相同,求出走d步都不会到达1~n点的每一点i的概率 ...

  3. PHP上传文件超过了最大文件大小限制导致无法上传成功

    最近的研究<HeadFirst PHP & MySQL>第一本书5章"使用存储在文件中的数据",难道当一个文件上传应用程序,发生了错误.即,文件不能成功上传.这 ...

  4. 漫谈并发编程(二):java线程的创建与基本控制

    java线程的创建 定义任务           在java中使用任务这个名词来表示一个线程控制流的代码段,用Runnable接口来标记一个任务,该接口的run方法为线程运行的代码段. public ...

  5. 自己动手写了第三阶段的处理器——教学OpenMIPS处理器蓝图

    我们会继续上传新书<自己动手写处理器>(未公布).今天是第十条.我每星期试试4 从本章開始将一步一步地实现教学版OpenMIPS处理器.本章给出了教学版OpenMIPS的系统蓝图,首先介绍 ...

  6. Python用Tkinter的Frame实现眼睛护士的倒计时黑色屏幕

    import Tkinter,time class MyFrame(Tkinter.Frame): def __init__(self): Tkinter.Frame.__init__(self) s ...

  7. Ubuntu下将vim配置为Python IDE(转)

    工欲善其事,必先利其器. 配置好了Django的环境,该把vim好好配置一下当做python的IDE来用. 在Windows下用惯了各种现成的工具,转到Linux下,一下没了头绪……好歹google出 ...

  8. COLORREF和COLOR和RGB的总结

    一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...

  9. SVN的命令行操作

    最近在进行svn二次开发,使用的是svnkit.看了很多svnkit的api,渐渐发现都是和SVN的命令行操作对应的.顺便研究一下svn的命名行操作. 1.将文件checkout到本地目录: 基本命令 ...

  10. c++进阶

    对网络编程/多线程/系统编程有一定了解:4:对ngnix,redis,memcache有一定了解:5:有高并发服务开发经验优先: 因为C/C++在嵌入式.移动互联网.物联网有很大的优势,有很多人就靠一 ...