之前的文章中介绍了My Blog文章维护功能的开发,开发过程中使用Area的方法建立了用于维护文章的Controller、View和Model。但是无论代码怎么变对于浏览器来说都是通过一个url地址去访问,现在My Blog可用的url有以下几个:
  http://localhost:52356/ -- 主页
  http://localhost:52356/Home --主页
  http://localhost:52356/Post --博客列表
  http://localhost:52356/Post/Get/1 --ID为1的博客内容
  http://localhost:52356/Home/About --网站关于信息

  http://localhost:52356/Admin/Home --管理首页
  http://localhost:52356/Admin/PostManagement --管理博客列表
  http://localhost:52356/Admin/PostManagement/Update/1 --更新ID为1的博客内容
  http://localhost:52356/Admin/PostManagement/Insert --添加文章

  从上面列表可以发现可以通过两个地址访问主页,但是管理主页只有一个地址,可以像主页一样把Home省略掉吗?出错了?为什么?而且为什么文章添加、修改都需要Action名称,但是列表页的Index不需要?

  

  根据URL来决定执行哪一个控制器的活动是ASP.NET MVC的路由机制决定的,本文将从以下几点来介绍ASP.NET的路由机制:

  ●Web服务器静态资源的访问
  ●ASP.NET中的路由机制
  ●路由表
  ●路由的注册
  ●路由注册参数说明
  ●关于Area的路由

Web服务器静态资源的访问

  当访问一个HTTP服务器上的静态文件时,一般通过域名+文件相对路径来访问,如最开始的使用html编写的文章列表页面:

  

ASP.NET中的路由机制

  在ASP.NET 提供了路由(Routing)机制,它分析url来决定将请求转到适当的位置,不再需要指定物理位置,但是ASP.NET的三种Web框架中路由机制也主要应用于MVC框架,其余的Web Form和Web Page常用的仍旧是通过物理地址访问(注:ASP.NET中的三种Web框架均可使用路由)。

路由表

  ASP.NET中可以使用路由的原因是一个ASP.NET应用中有一个路由表(RouteTable),在My Blog项目中的App_Start目录下的RouteConfig.cs文件中的注册路由(RegisterRoutes)方法的参数就是路由表,是一个System.Web.Routing.RouteCollection类型,以下是该类型的定义:

  

  

  注:在路由表的定义中有一个MapPageRoute的方法,该方法用于给Web Forms应用注册路由,并且从参数可以看出通过指定一个routeUrl去匹配一个物理文件路径。

  那MVC的路由注册方法在什么地方?MVC的路由仅仅是路由表的一个拓展,它位于System.Web.Mvc命名空间下:

  

 

路由的注册

  再回到RouteConfig类中注册路由的方法,这个方法它有这样几个作用:

   

  1. 添加一个名称为Default的路由条目。
  2. 路由用来匹配{controller}/{action}/{id}这种模式的url。
  3. controller和action的默认值是Home和Index,id是可选的(这里就解释了为什么http://localhost:52356/ 能够访问到HomeController的Index Action),而且在访问列表页面的Index Action的时候也不需要提供,因为默认已经被设置为Index。
  4. namespaces指定了只匹配命名空间在My_Blog.Controllers下的Controller(它解决了Home Controller重名的问题)。

路由注册参数说明

  1. name:

  路由信息的唯一标识,当注册两条name一致的路由会抛异常。
  2. url:

  它是一个url模板,它的格式与url一样,通过/分隔成多个段落,每一个段落可以由文字和变量占位符构成,其中变量占位符使用花括号{}扩住变量名称,文字不能有特殊字符。在一个段落中可以定义多个变量,但是变量之间一定要用文字隔开,如/{controller}-{action}/是不正确的。在mvc中必要的变量有{controller}和{action},那么{id}呢?每次创建默认MVC项目的路由注册模板中都有id这个变量它不是必要的吗?
  做个实验,把url模板中的{action}变量删除:

  

  运行程序后程序能够运行,但是出现以下两个问题:
  1). 使用Html.ActionLink创建的链接action参数失效,只生成一个空连接:

  

  

  2). 除了index action的连接都无法打开了:
  http://localhost:52356/Home/About 会被识别为http://localhost:52356/Home/ 然后加上默认的index跳转到主页。
  而Post没有被设置默认参数直接无法找到:

  

  3). 当把默认action默认参数也删除时,启动应用程序就直接抛异常了:

  

  

  注:但是删除{id}或者改变它的名称都不会错处,仅仅会影响action的参数绑定。

  3. defaults:

  路由的默认值,注意它不仅仅是路由模板的变量默认值,路由模板只是包含在路由值这个集合中,这也就是上面实验中把url目标的action变量删除后,它的默认值仍然有效的原有,关于路由值后面再详细介绍。

  4. namespaces:
  一个命名空间数组,代表这个路由只匹配这些命名空间下的controller。避免多个模块中存在同名Controller。所以如果一个应用程序存在多个模块,那么最好的方式就是针对每一个模块的路由都加上自己模块Controller的命名空间避免冲突。

  5. constraints:
  MapRoute方法中还有一个constraints参数,该参数是一个正则表达式集合,它用来验证url中的参数是否符合表达式的要求。

关于Area的路由

  Area是MVC用来分隔功能的,通过VS来对一个MVC应用添加Area之后,会自动添加一个{Area名称}AreaRegistration.cs的文件,该文件包含了对这个Area的路由注册,它的url模板根据area的名称进行了硬编码:

  

  该路由只匹配由Admin开头的url。
  如果存在重名可能,那么最好添加该Area的Controller的命名空间。

如何在ASP.NET MVC中使用路由 

  上面介绍了注册路由的方法和它的参数,并且根据示例代码可以看出,在MVC中注册路由只需要提供url模板和变量的默认值即可,如果应用中可能会存在同名Controller那么只需要再加入命名空间就好,这里就简单总结一下:
  ● ASP.NET MVC路由的url模板必须设置{controller}和{action}变量。
  ● 路由中可以通过defaults参数对路由值(包括模板变量)设置默认值。
  ● 如果存在命名冲突可以通过namespaces数组解决。
  ● 如果使用area来分隔功能,那么注意其自动生成的url模板,如果可能存在命名冲突,可以使用namespaces属性解决。
  ● 路由表是有序的,当匹配到一个路由后,后续的路由将不会被匹配,所以要注意顺序,以免被路由到错误的处理器(注:关于处理器后续文章介绍)。

小结

  本章简单介绍了ASP.NET的路由机制,以及在MVC程序中用于注册路由的方法和参数,并总结了路由的一些使用方法,在后续文章中将对路由的工作机制进一步介绍。

参考:

  https://msdn.microsoft.com/en-us/library/cc668201.aspx#setting_default_values_for_url_parameters

本文连接:http://www.cnblogs.com/selimsong/p/7660176.html

ASP.NET没有魔法——目录

ASP.NET没有魔法——ASP.NET MVC路由的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理

    ASP.NET MVC的路由是MVC应用的一个核心也是MVC应用处理的入口,作为一个开发者,在正常情况下仅仅需要做的就是根据需求去定义实体.业务逻辑,然后在MVC的Controller中去调用.Vie ...

  2. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  3. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

    对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...

  4. ASP.NET没有魔法——ASP.NET MVC Razor与View渲染 ASP.NET没有魔法——ASP.NET MVC界面美化及使用Bundle完成静态资源管理

    ASP.NET没有魔法——ASP.NET MVC Razor与View渲染   对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的 ...

  5. ASP.NET没有魔法——ASP.NET MVC 与数据库大集合

    ASP.NET没有魔法——ASP.NET与数据库 ASP.NET没有魔法——ASP.NET MVC 与数据库之MySQL ASP.NET没有魔法——ASP.NET MVC 与数据库之ORM ASP.N ...

  6. ASP.NET没有魔法——ASP.NET MVC IoC

    之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...

  7. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  8. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  9. ASP.NET没有魔法——ASP.NET 身份验证与Identity

    前面的文章中为My Blog加入了文章的管理功能(ASP.NET没有魔法——ASP.NET MVC使用Area开发一个管理模块),但是管理功能应该只能由“作者”来访问,那么要如何控制用户的访问权限?也 ...

  10. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

随机推荐

  1. 记录一笔关于PHPEXCEL导出大数据超时和内存溢出的问题

    通过查阅资料可以找到PHPEXCEL本身已经有通过缓存来处理大数据的导出了.但是昨晚一直没有成功,这可捉急了.最后想来想去就替换了phpExcel的版本了.最后就成功了.话不多说,代码附上 <? ...

  2. NPOI 1.2 教程

    NPOI 1.2 教程官方地址 很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解. 目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 ...

  3. ES6 modules 详解

    概述 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ruby 的require.Pytho ...

  4. Java常用命令与参数设置

    我介绍的JDK版本: 首先.介绍下JDK常用参数设置,如下是我个人环境的参数: -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m 我们 ...

  5. ubuntu16.04编译安装php7.2

    1,下载解压 tar xf php-7.2.0.tar.gz cd php-7.2.0/ 2,安装必要的库 sudo apt-get install libxml2-devsudo apt-get i ...

  6. [Micropython]发光二极管制作炫彩跑马灯

       先甩锅 做完后才发现最后一个灯坏了,就坏了一个灯也不好意思去找淘宝店家,大家视频凑合着看把.不过并不影响实验效果.因为这个发光二极管白天不是很明显 晚上炫彩效果就能出来了.本次实验用的是8个灯珠 ...

  7. ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

    ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序 ...

  8. Docker三十分钟快速入门(下)

    一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...

  9. 【SmartOS】轻量级多任务调度系统

    SmartOS是一个完全由新生命团队设计的嵌入式操作系统,主要应用于智能家居.物联网.工业自动化控制等领域. ARM Cortex-M系列微处理器几乎全都做成单核心,对于业务逻辑较复杂的物联网就显得难 ...

  10. 魔方 NewLife.Cube

    魔方 是一个基于 ASP.NET MVC 的 用户权限管理平台,可作为各种信息管理系统的基础框架. 演示:http://cube.newlifex.com 源码 演示账号:admin/admin 源码 ...