在一个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 Beta的系列入门文章,有朋友提议说写一个示例程序来同步讲解,那样更加容易学习.所以就写选择了写一个Blog程序来作为示例程序.(原来是居于ASP.NET MVC Pr ...

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

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

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

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

  4. ASP.NET MVC 入门

    入门基础 ASP.NET MVC 是微软系列基于 C# 语言的 Web 开发框架,并不适合 0 基础入门,在学习之前你必须要了解 4 个知识点: 1.HTML 基础.网页的基本标签,结合 ASP.NE ...

  5. ASP.NET MVC 入门3、Routing

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

  6. 从零开始学习ASP.NET MVC 入门

    <从零开始学习ASP.NET MVC 1.0> 文章导航 (一) 开天辟地入门篇 (二) 识别URL的Routing组件 (三) Controller/Action 深入解析与应用实例 ( ...

  7. 16、ASP.NET MVC入门到精通——MVC过滤器

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在ASP.NET MVC中有四种过滤器类型 Action 1.在ASP.NET MVC项目中,新建文件夹Filter,然后新建类MyCust ...

  8. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

  9. ASP.NET MVC 入门2、项目的目录结构与核心的DLL

    我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...

最新文章

  1. 常用几种激活函数的总结
  2. java arraylist的问题
  3. golang 中的sort 包
  4. C# 小工具开发--DeBugHttp
  5. 阿里25k 百度25k,招WPF!
  6. [剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]
  7. Flsak爱家租房--个人信息
  8. eja智能压力变送器工作原理_压力变送器的原理、接线和安装方法
  9. 美团工程师回应“频繁定位”:常用App权限开启时检测结果基本一致
  10. java 中的jframe_java中JFrame是什么
  11. Java面试通关要点汇总整理
  12. java mysql 单例模式_java 单例模式(singleton)连接 mysql 数据库
  13. 复星旅文冲刺港交所:上半年营收66亿 核心收入来自度假村
  14. C语言选择题(含答案)
  15. 专利检索常用的网站有哪些?
  16. 【软件设计师】知识点总结
  17. 苹果与宝马和奔驰关于自动驾驶汽车的谈判告吹,退而求其次选择与大众汽车合作
  18. 【图灵学院】JAVA互联网架构【全】
  19. guzzlehttp/guzzle使用
  20. minigui 编译与使用

热门文章

  1. Redis 和Memcache的区别
  2. epoll、mysql概念及简单操作
  3. 财务与IIT的发展正在质变
  4. 获取pycharm 2016.1.4 注册码 (window系统) 2016.3注册码(Ubuntu系统)
  5. python 第3天
  6. SylixOS线程创建的流程分析
  7. CentOS 7安装Gnome GUI 图形界面
  8. python for IOS,支持iPhone
  9. HTML、CSS、JS对unicode字符的不同处理
  10. Android:获取最近打开app列表