1.前言

  在创建一个MVC项目后就可以,在App_Start文件下的RouteConfig.cs里面就可以定义我们的路由规则,其中已经有默认的路由规则了,routes.IgnoreRoute是让路由规则忽略部分文件,如下:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

  在此处定义的路由规则后还需要在Global.asax文件下注册路由规则,之后url访问就会自上而下的去匹配路由规则,匹配到就不再往下匹配了,所以要把特殊的路由规则放在前面,最后才是通用规则。

RouteConfig.RegisterRoutes(RouteTable.Routes);

  MapRoute有以下五个静态重载方法,参数含义分别是:routes:应用程序的路由的集合(这里是不用填的,因为this这个关键字)。name:要映射的路由的名称。url:路由的 URL 模式。defaults:一个包含默认路由值的对象。namespaces:应用程序的命名空间constraints:路由约束,用于指定 url 参数的值。接下来展示这五个重载方法中的关键参数的使用与其他的路由的情况。

public static Route MapRoute(this RouteCollection routes, string name, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);

 2.name 和 url

  这个方法有两个参数,一个是name:这个路由规则的名称,url:路由url定义。name可以随便取名,url后的{controller}和{action}是一定要这么命名的并且成对出现缺一不可,这是规定。这个方法由于没有默认的参数,所以当url匹配到该规则的时候为http://localhost:65398/的时候会404,后续规则不再匹配.

routes.MapRoute(
name: "Method1",
url: "{controller}/{action}/{id}"
);

  URL定义如何那么匹配的url就是怎么样的,多一个参数也会无法匹配,所以当有多个参数的时候就可以加入{*catchall}捕获多个参数,也可以在前面加上前缀,如下所示。

routes.MapRoute(
name: "Method1",
url: "Homes/{controller}/{action}/{*catchall}"
);

  如果我们要把MVC设置伪静态的话就可以如下所示,不过这样也会因为被认为是静态文件而被跳过显示404,我们可以在web.config文件中添加如下的代码。

routes.MapRoute(
name: "Method1",
url: "{controller}/{action}.html"
);
<system.webServer>
<handlers>
<add name="ReWriteHtmlHandler" path="*.html" modules="IsapiModule" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

3.defaults:默认路由

  defaults:就是默认路由。如果URL是http://localhost:65398/这样的情况,就会进入这个默认路由了。如果url参数中有{id}的定义就必须在defaults参数中定义id=UrlParameter.Optional,原因在这篇博客中有解释https://www.cnblogs.com/pipizhu/archive/2011/08/10/2134222.html。contoller或者action的默认值都可以单独设置,如果是defaults: new {  action = "Index", id = UrlParameter.Optional },则对应http://localhost:65398/Homes这种路由。

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

4.constraints:条件约束

  constraints:条件约束,可以在这里加入正则表达式来约束controller和acion或者是请求方式get or post,只有满足这个约束的路径才会被匹配,不满足就不匹配。

routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { controller = "^H.*", action = "^Index$|^About$", httpMethod = new HttpMethodConstraint("GET") }
);

  也可以直接强制要求访问指定的controller或者action。

routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { controller = "Homes", action = "index", httpMethod = new HttpMethodConstraint("GET") }
);

5.namespaces:命名空间

  namespaces:命名空间。优先先访问在这个命名空间下的controller和action,匹配到就结束匹配,如果没有找到就继续执行到别的命名空间匹配,可以设置多个命名空间。

routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "ZNM.WEB.Controllers", "ZNM.WEB.Controllers.Admin.Znm" }
);

6.area的路由、webapi的路由

  webapi和area的路由重载方法和routconfig.cs中的一摸一样。具体的路由配置文件如下图所示。

  

  webapi的路由和area的路由和RouteConfig.cs中的路由相同,都是在Global.asax中注册的,只是webapi的路由只绑定到controller。按照Global.asax中路由文件注册的顺序与每个路由文件中匹配规则的注册顺序,所有路由规则都被存储在routes中如下图所示。路由规则的匹配则也是按照这个注册的顺序来的,如果想要改变webapi、area和不同route注册顺序,只要在Global.asax中将注册顺序换一下就可以了。

  

7.总结

  路由的基础使用方法就是以上几种,基本上通常的默认的就够用了。有问题指出可以在下方留言,谢谢。

.Net Mvc 4 Route路由的更多相关文章

  1. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  2. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  3. 第2章 ASP.NET MVC(URL、路由及区域)

    * { font: 17px/1.5em "Microsoft YaHei" } ASPNET MVC URL.路由及区域 一.URL.路由及区域 一.      配置路由器 1. ...

  4. 【翻译】ASP.NET MVC 5属性路由(转)

    转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...

  5. MVC 支持同名路由,不同命名空间

    有时候我们会碰到两个项目合在一起,那么必然会碰到两个同名的controller,其实MVC在注册路由,添加Route的时候可以指定当前规则解析那个命名空间下的所有Controller. 注:Contr ...

  6. 一步步学习ASP.NET MVC3 (14)——Route路由

    请注明转载地址:http://www.cnblogs.com/arhat 由于今天是星期六,所以多写几篇,感觉前几天的忙碌没有及时发布文章,趁着周末老魏尽力的多写几篇文章.因为本系列基本上快结束了,所 ...

  7. MVC3/4/5/6 布局页及Razor语法及Route路由配置

    一.目录结构 二.Razor语法 代码块:@{},如:@{Html.Raw(“”);} @if(){} @switch(){} @for(){} @foreach(){} @while(){} @do ...

  8. 005. Asp.Net Routing与MVC 之三: 路由在MVC的使用

    上次讲到请求如何激活Controller和Action,这次讲下MVC中路由的使用.本次两个关注点: 遗留:ModelBinder.BindModel的过程 MVC中路由的使用 MVC 5中的Acti ...

  9. asp.net core mvc 中间件之路由

    asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...

随机推荐

  1. Row_number() OVER(PARTITION BY xxx ORDER BY XXX)分组排序

    --//创建一个信息表 ,) ,),st_name ),class ),score ,)) --//插入测试数据============start=================== insert ...

  2. selenium 移动端测试

    selenium 可以进行移动测试的.Anroid ,IOS .进行移动端测试,需要相应的SDK ,apk.其中anriod 是selenium 支持有2中选择,remote server 和 tes ...

  3. 自定义 sql Split函数 / 自定义mp_helptext查看存储

    1. 分割函数: --Split 表函数将一个字符串按指定分隔符进行分割,返回一个表. create function split( ),--待分割字符串 )--分割符 ))) as begin ) ...

  4. linux上传、下载文件rz、sz命令

    1.介绍 sz命令是利用ZModem协议来从linux服务器传送文件到本地,一次可以传送一个或多个文件.相对应的从本地上传文件到Linux服务器,可以使用rz命令. 2.参数说明 -a,以文本方式传输 ...

  5. C4C销售订单行项目价格维护方法

    需求很简单,能够创建销售订单,在行项目里添加产品,带出价格来,同时把总价显示在销售订单抬头区域. 如下图所示: 下面是具体配置. Business Configuration里,点击Sales Ord ...

  6. 在jupyter notebook 中同时使用安装不同版本的python内核-从而可以进行切换

    在安装anaconda的时候,默认安装的是python3.6 但是cs231n课程作业是在py2.7环境下运行的.所以需要在jupyter notebook中安装并启用python2.7版本 方法: ...

  7. python 3+djanjo 2.0.7简单学习(二)--创建数据库和模型

    我们紧接上次,这里将建立数据库,创建第一个模型提示:这里我们不需要去一直启动,django会在我们ctrl+s的时候自动刷新并启动服务,很方便吧  1.数据库配置 现在,打开 vote_mysite/ ...

  8. 曲率(Curvature)

    原文链接 几何体的曲率对于不同的对象有不同的定义.首先来看最简单的平面曲线. 首先把曲线分成无穷小的小段,每一段看作某个圆的一小段圆弧.这个圆叫做“密切圆”(Osculating Circle).由于 ...

  9. HttpHandler(处理程序) 和 HttpModule(托管模块)

    本文参见:http://www.tracefact.net/Asp-Net/Introduction-to-Http-Handler.aspx 前言:前几天看到一个DTcms网站,里面有个伪静态技术, ...

  10. lambda函数,内置map()函数及filter()函数

    8.1 lambda函数 作用及意义:  1.没必要专门定义函数,给函数起名,起到精简的效果  2.简化代码的可读性 def ds(x): return 2 * x + 1 ds(5) ---11 g ...