本系列文章基于Microsoft ASP.NET MVC Beta.

在一个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

      在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和"."被作为一个定义符来解析,而定义符之间的值则匹配 ...

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

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

    随机推荐

    1. Android——四种AterDialog

      本经验将分别介绍Android里面的四种AlertDialog分别是:显示带中立,取消,确定的提示框. 获取带列表的对话框按钮.获取带单选列表的对话框按.获取显示带多选项的对话框.此经验介绍获取显示带 ...

    2. C++实现元组

      一般我们使用struct时需要在头文件中定义,例如 struct Example { int a; char b; ... }; 这样将数据打包好必须在程序运行之前将其定义好,如果有需求在程序运行时添 ...

    3. 利用wireshark抓取Telnet的用户名和密码

      使用wireshark抓取Telnet   目标ip地址(telnet  192.168.88.1 ) 1,首先打开wireshark,然后选择网卡,点击开始. 2,为了在filter中输入telne ...

    4. 一个layer可以跟着画完的线移动ios程序 好玩啊。

      用法:采用的是关键帧实现的. 实验目的:让上层的layer子层能够跟着在另一个子层上花的线进行移动 .即当线画完之后,图形开始移动,并且能够停在最后的那个位置 效果图: 采用是直接在layer图层上进 ...

    5. [openMP] OpenMP在visual studio和mac上的配置

      今天弄了半天才弄好mac上的openmp,一方面智商下限,另一方面竟然发现网上也没有什么详细过程,特意把我的配置过程贴上来 多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得 ...

    6. mysql 相关环境配置

      1. mysql 版本要求 5.5 以上, 否则不支持 emoji 表情. $ sudo apt-get install mysql-server $ sudo vim /etc/mysql/my.c ...

    7. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(三)

      jar包完成后,剩下就是要构建ANE包来供实际程序调用. 首先要建两个Flex库项目, default那个是官方建议加上的,仅用于不在真实环境下编译调试的时候有个默认接口不至于调用不成功报错,项目结构 ...

    8. el-get

      el-get Table of Contents 1. 依赖 2. 安装 3. 配置 3.1. 自定义包配置 4. 命令 5. 管理扩展 el-get 是一个emacs下的扩展管理工具.就像apt-g ...

    9. JavaScript 中的内存泄漏

      JavaScript 中的内存泄漏 JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回.JavaScript 的垃圾收集机 ...

    10. Interface的多层继承

      我有一段如下代码,定义一个接口iInterface,cBase实现iInterface,cChild继承cBase,UML为 预期是想要cBase.F()的执行逻辑,同时需要cChild的返回值,所以 ...