在一个route中,通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配到占位符中。route定义中不在大括号中的信息则作为常量值。
下面是一些示例URL:

Valid route definitions

Examples of matching URL

{controller}/{action}/{id}

/Products/show/beverages

{table}/Details.aspx

/Products/Details.aspx

blog/{action}/{entry}

/blog/show/123

{reporttype}/{year}/{month}/{day}

/sales/2008/1/5

通常,我们在Global.asax文件中的Application_Start事件中添加routes,这确保routes在程序启动的时候就可用,而且也允许在你进行单元测试的时候直接调用该方法。如果你想在单元测试的时候直接调用它,注册该routes的方法必需是静态的同时有一个RouteCollection参数。
下面的示例是Global.asax中的代码,演示了添加一个包含两个URL参数action 和 categoryName的Route对象:


public static void RegisterRoutes(RouteCollection routes)
{
    //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");      routes.MapRoute(
        "Category",                                              // Route 的名称
        "Category/{action}/{categoryName}",                           // 带有参数的URL
        new { controller = "Category", action = "Index", categoryName = "4mvc" }  // 设置默认的参数
    );  }  protected void Application_Start()
{
    //在程序启动的时候注册我们前面定义的Route规则
    RegisterRoutes(RouteTable.Routes);
}

更多文章请参考:

    • System.Web.Routing入门及进阶 下篇 By 重典
    • System.Web.Routing入门及进阶 上篇 By 重典
    • ASP.NET MVC URL Routing 学习 By Q.Lee.lulu
    • ASP.NET Routing (官方文档)
       

      在这里我不打算再详细去讲解。以下只是简单的说明一下。

      忽略对某类URL的Routing:

          //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      添加约束条件,支持正则表达式。例如我们需要对id参数添加一个必须为数字的条件:

      routes.MapRoute(
          "Default",                                              
          "{controller}/{action}/{id}",                           
          new { controller = "Home", action = "Index", id = "" },  
          new { id = @"[\d]*" } //id必须为数字
      ); 

      使用星号(*)匹配不确定个数的参数,这会匹配URL后面所有的剩余的参数。例如:

      query/{queryname}/{*queryvalues}

      对于url:query/aspnetmvc/preview5/routing ,则queryvalues参数匹配的参数为 preview5/routing。

      url匹配Route是根据Route的定义顺序来自上而下匹配的。例如我们定义两个Route:

      
      public static void RegisterRoutes(RouteCollection routes)
      {
          routes.MapRoute(
              "Default",                                              // Route 的名称
              "{controller}/{action}/{id}",                           // 带有参数的URL
              new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
          );
          routes.MapRoute(
              "Post",
              "Post/{id}",
              new { controller = "Post", action = "Index", id = "" }
          );

      不知你看出上面定义的两个Route有什么问题没有?我想你看出来了,URL永远都匹配不了第二个Route,也就是名为Post的Route,因为能匹配第二个Route的url一样也能匹配第一个Route,而url匹配Route是根据Route的定义顺序来自上而下匹配的,所以URL永远都匹配不了第二个Route。所以,在定义Route的时候,要将一些特别的Route放到前面。

      如果你要将ASP.NET MVC部署到IIS6下面,由于IIS6对于http://blog.51mvc.com/index这类没有扩展名的URL是不会交由ASP.NET的aspnet_isapi.dll处理的,所以你的ASP.NET MVC程序部署到IIS6的时候可能会出现404错误。你可以为你的ASP.NET MVC站点添加一个通配符:

      然后点击"通配符应用程序映射"下的"插入"按钮,在弹出的对话框中如下设置:

      你如果担心添加通配符会给出现性能上的问题,那么你可以修改Route为带扩展名的,这个扩展名是完全由你自己定义的,例如我们使用4mvc来做url的扩展名:

      routes.MapRoute(
          "Default",                                              // Route 的名称
          "{controller}.4mvc/{action}/{id}",                           // 带有参数的URL
          new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
      ); 

      然后再在IIS6中添加这个扩展名的映射:

      然后我们访问的URL类似于:http://blog.51mvc.com/Home.4mvc/index

      群上有些朋友说希望教程能根据一个示例程序来写,那样更容易他们的学习。所以这里就写一个Blog的示例程序,为了方便,Model就直接使用Blogengine的业务实体部分。在这里我们先定义这个blog的Route:

      public static void RegisterRoutes(RouteCollection routes)
      {
          //忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");      routes.MapRoute(
              "Admin",
              "Admin/{action}",
              new { controller = "Admin", action = "Index" }
          );      routes.MapRoute(
              "PostById",
              "Post/{id}",
              new { controller = "Home", action = "Post", id = "" },
              new { id = @"[\d]+" }
          );      routes.MapRoute(
              "PostBySlug",
              "Post/{slug}",
              new { controller = "Home", action = "Post" }
          );      routes.MapRoute(
              "Default",                                              // Route 的名称
              "{controller}/{action}/{id}",                           // 带有参数的URL
              new { controller = "Home", action = "Index", id = "" }  // 设置默认的参数
          );  } 

      暂时就学到这里吧。后面我会给出本示例Blog程序的代码。Enjoy!Post by Q.Lee.lulu

[转]ASP.NET MVC 入门3、Routing的更多相关文章

  1. ASP.NET MVC 入门系列教程

    ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...

  2. ASP.NET MVC 入门

    ASP.NET MVC 入门 (Learning ASP.NET MVC) 传统的WebForm发展到如今出现不少的缺陷, 比如为了解决Http的无状态WebForm模式使用了ViewsState来保 ...

  3. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  4. 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...

  5. ASP.NET MVC 入门8、ModelState与数据验证

    原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html ViewData有一个ModelState的属性,这是一个类型 ...

  6. Asp.net MVC入门视频教程

    编程开发 > Asp.net视频教程 > Asp.net MVC入门视频教程 > 1.传统web处理方式和mvc处理方式 上传日期:2014-08-16 10:02:45  相关摘要 ...

  7. [转]ASP.NET MVC 入门8、ModelState与数据验证

    ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html. ...

  8. ASP.NET MVC 入门3、Routing

    本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和& ...

  9. 7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...

随机推荐

  1. Linux C 程序 空语句-gcc编译命令(SIX)

    C语言语句1.空语句:当一个if或者while判断部分能完成工作,空语句可以用来表示if或者while内的空循环体 if(a == b ); 2.gcc编译器 //程序的编译过程: // 预处理:pr ...

  2. 支持HTML5新标签

    IE8/IE7/IE6支持通过document.createElement方法产生的标签,               可以利用这一特性让这些浏览器支持HTML5新标签,               ...

  3. 关于Active控件的电子签名 转

    关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...

  4. 51nod1174区间中最大的数

    1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...

  5. shopnc 商城源码阅读笔记-缓存技术

    缓存方式 : 从 shopnc 的缓存驱动目录 /framework/cache里已有的实现类来看,shopnc支持以下5种缓存方式 apc Eaccelerator file memcache xc ...

  6. c/c++中的各种字符串转换

    一:CString 和 *char 的转换: 1:CString -> *char 1)CString转化为*char可以使用CString中的GetBuffer()函数,具体如下: CStri ...

  7. MySQL中SQL语句的分类

    1:数据定义语言(DDL) :创建和删除数据库(CREATE DATABASE || DROP  DATABASE):2:创建.修改.重命名.删除表(CREATE  TABLE || ALTER TA ...

  8. Hive(转)

    Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...

  9. SDC(5)–FPGA系统级同步输入的约束

    此时计算最大/最小输入延时时,是不应该考虑FPGA本身的tSU/tH的,因为数据进来之后不一定马上送到DFF. 例如: 此时约束如下:

  10. JavaScript decodeURI() 和 encodeURI() 函数

    定义和用法 decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码. 语法 decodeURI(URIstring) 参数 描述 URIstring 必需.一个字符串 ...