URL Routing是非常重要的一块技术体系,笔者将URL Routing的知识进行梳理后得出本文,旨在同大家分享,希望能够起到抛砖引玉的作用。

1.    什么是URL Routing

所谓URL Routing(URL路由),指的是在Web中,URL不再是文件目录中的一个文件,而是一个说明有关URL路由的字符串,开发者可以自定义该字符串的格式。

2.    为什么要使用URL Routing

主要目的:URL更加的友好,方便web使用者理解相关页面的功能。至于其它目的嘛,这个就太广了,甚至可以在使用中慢慢挖掘它的用处。

3.    URL RoutingMVC才有的吗?

URL Routing的程序集System.Web.Routing位于.NET框架3.5的SP1版本中,是与ASP.NET MVC框架分离的,因此,在WebForm项目中也可以使用路由。

4.    如何在WebForm中使用路由?

要在WebForm中使用路由,只需要完成4个步骤即可:

Ø 添加对System.Web.Routing的引用;

Ø 创建一个实现IRouteHandler接口的类,如WebFormRouteHandler类;

Ø 在Global.asax.cs中将我们创建的RouteHandler进行全局应用配置;

Ø Web.config中配置System.Web.Routing的引用

using System.Web;
using System.Web.Routing;
using System.Web.Compilation;
using System.Web.UI;

namespace RoutingInWebForm
{
    public class WebFormRouteHandler:IRouteHandler
    {
        public string VirtualPath{ get;private set; }

public WebFormRouteHandler(string virtualPath)
        {
            this.VirtualPath = virtualPath;
        }

public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(Page)) as IHttpHandler;
            return page;
        }
    }
}

using System;
using System.Web.Routing;

namespace RoutingInWebForm
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes(RouteTable.Routes);
        }

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.Add("Named", new Route("foo/bar", new WebFormRouteHandler("~/WebForm1.aspx")));
            routes.Add("Number", new Route("one/two/three", new WebFormRouteHandler("~/WebForm2.aspx")));
        }
    }
}

Web.config中配置System.Web.Routing的引用的代码如下:

<httpModules>
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

在WebForm中使用路由代码下载

5.    如何定义URL Routing

开发者一般通过Global.asax.cs文件,在Application_Start()中设置路由定义,通过静态类RouteTable的属性Routes来设置URL路由,关于URL Routing的定义,是比较灵活的。

6.    如何设定URL Routing的参数默认值?

当你定义一个路由时,你可以把一个缺省的值赋给一个参数。如果URL中没有提供此参数值,那么将使用此缺省值。你可以为一个路由设置缺省值,这可以通过把一个字典赋值给Route类的Defaults属性来实现。下列示例给出了一个带有缺省值的路由。

void Application_Start(object sender, EventArgs e)
{
   RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
 routes.Add(new Route
 (
    "Category/{action}/{categoryName}"
         new CategoryRouteHandler()
 )
   {
      Defaults = new RouteValueDictionary
          {{"categoryName", "food"}, {"action", "show"}}
    }
 );
}

当URL路由处理一个URL请求时,本例中所定义的路由将产生如下列表格所示的结果。

URL

参数值

/Category

action = "show"

categoryName = "food"

/Category/add

action = "add"

categoryName = "food"

/Category/add/beverages

action = "add"

categoryName= "beverages"

7.    如何为URL Routing添加约束?

当你把路由定义添加到路由集合时,你可以添加约束条件。下面的示例添加的约束用于限制在locale和year参数中应该包括什么样的值。

void Application_Start(object sender, EventArgs e)
{
   RegisterRoutes(RouteTable.Routes);
}
 
public static void RegisterRoutes(RouteCollection routes)
{
   routes.Add(new Route
   (
     "{locale}/{year}"
        , new ReportRouteHandler()
   )
      {
         Constraints = new RouteValueDictionary
         {{"locale", "{a-z}{2}-{A-Z}{2}"},{year, @"\d{4}"}}
      });
}

8.    Routing的扩展方法

 

扩展方法的由来:路由程序集(System.Web.Routing)是在2008年8月11日更新的.NET 3.5框架SP1版本中发布的,而ASP.NET 3.5 MVC 1.0版本是在2009年3月18日才正式发布。在ASP.NET MVC版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,所以将扩展方法加在了System.Web.Mvc程序集的RouteCollectionExtemsion类中。

关于Routing的扩展方法的UML及重载方法如下图所示:

9.    如何自定义路由约束?

要实现自定义路由约束,实际上非常的简单,只需要实现IRouteConstraint接口中的Match()方法即可。

10.    如何优化路由设置?

Ø 将最常用的路由存放在路由表的最前面

Ø 在View中指定路由的名称。这样,就不会寻找其它匹配的路由。

11.    路由解析的工作机制分析

路由解析是按照一定的管道进行的,路由解析的管道图如下所示:

ASP.NET 3.5路由总结篇的更多相关文章

  1. ASP.NET MVC的路由

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

  2. ASP.NET WebForm 的路由

    ASP.NET WebForm 的路由 偷会闲, 看看博客园, 有筒子写了篇: ASP.NET的路由 我翻了翻两前的一份邮件, 是我当时在项目之余的时间研究的,那时还没用MVC,所有项目都是 WebF ...

  3. ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

    一.前言 1.本文主要内容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC带路径参数的路由示例 ASP.NET Core MVC固定前/后缀的路由示例 ASP.NE ...

  4. ASP.NET Web API 框架研究 ASP.NET Web API 路由

    ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...

  5. ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门

    敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...

  6. ASP.NET Core的路由[5]:内联路由约束的检验

    当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...

  7. ASP.NET Core的路由[4]:来认识一下实现路由的RouterMiddleware中间件

    虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中 ...

  8. ASP.NET Core的路由[3]:Router的创建者——RouteBuilder

    在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...

  9. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

随机推荐

  1. 14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚

    14.5.5.2 Deadlock Detection and Rollback Deadlock 检测和回滚 InnoDB 自动检测事务死锁和回滚一个事务 InnoDB 尝试挑选小的事务来回滚,事务 ...

  2. MySQL数据表修复, 如何修复MySQL数据库(MyISAM / InnoDB)

    常用的Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair 即执行REPAIR TABLE SQL语句 语法:REPAIR TABLE tablename[,table ...

  3. 我要爱死这个markdown 了

    今天上班依旧看wpdang的文章,最后作者说,文章使用markdown写的,好奇心促使我搜了一把什么是markdown.然后看到了这篇文章,一瞬间就开始兴奋了.顿时觉得,这个东西太好用 了,简直又激起 ...

  4. 获取css的属性值

    # -*- coding:utf-8 -*- """ 在元素上执行双击操作 """ from selenium import webdriv ...

  5. .net开源工作流引擎ccflow

    关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...

  6. mac上的键盘生活——快捷键列表

      主界面 command + tab 切换程序 command + `   在程序内切换界面 command + w     关闭界面 command + q     关闭程序   文本编辑 Com ...

  7. 用PHP写的一个简单的分页类 1.0版

    <?php /* 分页类 用于实现对多条数据分页显示 version:1.0 author:Knight E-Mail:S.Knight.Work@gmail.com Date:2013-10- ...

  8. there be 句型

    there be 意思:表示存在或者发生. 英文释义:used to show that sth exists or happens 如果现在进行时,单数时用is,复数时用are. 现在我问你一个问题 ...

  9. 通过例子学python(1)

    第一章 基础知识 1.4 数字和表达式 # -*- coding: cp936 -*- # 1.4 数字和表达式 # ** 表示幂(乘方)运算 #1.4.1 长整型数 print(9999999999 ...

  10. c#委托和事件(上)

    C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 ...