MVC 路由规则
一、路由规则说明
先来看MVC中的默认路由的说明
"{controller}/{action}/{id}", // URL with parameters

对于Url /Home/Index/1
匹配结果是:
controller : "Home"
action : "Index"
Id : "1"
对于Url /a.b/c-d/e-f
匹配结果是:
controller : "a.b"
action : "c-d"
Id : "e-f"

为了Asp.net MVC框架的正常运行,框架要求使用一些特定的参数名称{controller}和{action}。
假设我们想让所有的MVC请求都以site开头,那么路由我们可以改成这样
site/{controller}/{action}/{id}
假设想让所有的页面都以.aspx为后缀,则可以这样写
{controller}/{action}.aspx/{id}
现在来将Global.asax.cs的路由复制出来解释一下

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
} public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
"Default", // 路由的名称
"{controller}/{action}/{id}", // 带参数的匹配规则
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 默认参数,即当不输入时间的处理方法
);
} protected void Application_Start()
{
//这里还可以加一行
RouteTable.Routes.RouteExistingFiles = true; //如果设为true,这行表示,该网站所有的HTTP请求都会使用RegisterRoutes()方法中定义的网址里有规则一一进行比对,如果对比成功就会用Asp.net Mvc进行处理,若对比失败,再检查磁盘上的文件。默认是false的,因为Html文件,css,js文件等可以优先不经过路由直接显示。
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
//注册前面定义的路由,所有的Asp.net MVCRouting都在此定义,其中参数RouteTable.Routes是一个公开的静态对象,存储了所有的Routing规则集(RouteCollection类)
RegisterRoutes(RouteTable.Routes);
}
}

1、IgnoreRoute 不理会的路由说白了就是用来定义不需要通过Routing处理的网址。
例如:http://localhost/Trace.axd
OK,该条路径匹配成功{resource}.axd比对到Trace.axd。而{*pathInfo}比对到空。因此匹配成功。匹配成功就怎么样呢?Ignore,不处理。也就是,上面那条Url是不会被Asp.net MVC处理的。
2、MapRoute() 最常用来定义Routing规则的辅助方法。用于定义一条路由。其中第一个参数是路由名称,第二个参数是Url以及参数,第三个是默认值。
3、我们之前看到个 * 号,它表示Catch-All。即不管什么乱七八糟的东西都匹配。没有就匹配空。
4、UrlParameter.Optional 指定可选参数的默认值,当不填写的时候,不会添加进参数字典。
二、自定义路由

routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}/{age}/{birthday}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional ,
age=18 ,birthday=new DateTime(1989,1,1) }, // 参数默认值
); public ActionResult Index( string id , int age , DateTime birthday)
{
return View();
}

三、定义可变长度的参数的路由
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}/{*catchall}", // 带有不定个数的参数的 URL
new { controller = "Home", action = "Index",
id=UrlParameter.Optional }, // 参数默认值
);
序号 | URL 示例 | 映射结果 |
0 | mydomain.com | controller=home,action=index |
1 | mydomain.com/Customer | controller=Customer,action=index |
2 | mydomain.com/Customer/List | controller=Customer,action=List |
3 | mydomain.com/Customer/List/All | controller=Customer,action=List,id=All |
4 | mydomain.com/Customer/List/All/Delete | controller=Customer,action=List,id=All,catchall=Delete |
5 | mydomain.com/Customer/List/All/Delete/Perm | controller=Customer,action=List,id=All,catchall=Delete/Perm |
四. 定义命名空间的优先级
根据以上内容我们已经知道,当URL匹配上一个路由之后,就会提取路由中的信息,然后进行进一步处理。假如现在我们的某个路由提取出了一个controller为Account ,并且我们的解决方案中有不只一个名为“AccountController”的类,由于路由并不知道要调用哪个controller ,这个时候就会出现错误。那么,如何解决这种问题呢?我们可以在注册路由的时候,指定某个路由有限查找controller 的命名空间,如下面的代码所示。

routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index",
id = UrlParameter.Optional }, // 参数默认值
new string[] { "MyNamespace.Controllers" } //指定优先命名空间
);

五、路由约束

routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional }, // 参数默认值
//设置匹配约束
new {controller = "^H.*" , action ="^Index$|^About&" , //必须要被正则表达式成功匹配,才使用该路由
httpMethod=new HttpMethodConstrain("Get") } //指定只使用Get方法的请求才会被匹配
);


public class UserConstrain : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
return true ; //你可以在这里做具体的操作
}
} routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id
=UrlParameter.Optional }, // 参数默认值
new {controller = "^H.*" , action ="^Index$|^About&" ,
httpMethod=new HttpMethodConstrain("Get") ,
customConstrain= new UserConstrain () } , //设置匹配约束
new string[] { "MyNamespace.Controllers" } //指定优先命名空间
);

MVC 路由规则的更多相关文章
- 【基础】MVC路由规则
一.RouteData解析过程 在ASP.NET MVC中,服务器收到来自客户端的请求后,会经过一些列的处理拿到请求的数据,比如在Pipeline 管线事件中,通过订阅适当的事件,将HttpConte ...
- MVC路由规则进一步了解
本周由于工作需要,接触了PetaPoco(一个小型的ORM-框架)和ExtJS,这个项目框架是别人写好的,用的是MVC,我写的MVC程序一般控制器和视图都是在一个类库下面的,但是作者是把MVC中的控制 ...
- ASP.NET MVC路由规则
1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...
- mvc路由规则相关
1,可以创建多条路由规则,每条路由规则的name属性不能相同 2,路由规则是有顺序的,如果被前面的规则匹配了,那么后面的规则就没有机会了 下面是一条路由规则的代码 routes.MapRoute( n ...
- MVC路由规则以及前后台获取Action、Controller、ID名方法
1.前后台获取Action.Controller.ID名方法 前台页面:ViewContext.RouteData.Values["Action"].ToString(); Vie ...
- MVC路由规则
1 可以创建多条路由规则,每条路由规则的那么属性不同 2路由规则是有顺序的.如果被前面的规则匹配了,那么后面的规则就没机会了 3 constraints 约束: 4namespaces 命名空间 5r ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]
如要实现列表中地址全路径“bubuko-11-2.html”,在首次进入时,使用短路径“bubuko.html”,只有再次href后才显示全路径“bubuko-11-2.html”,下面使用路由规则来 ...
- MVC之路由规则 (自定义,约束,debug)
自定义路由规则的要求,小范围写在前,大范围写在后.路由规则可以注册多条,路由规则的名称不能重复路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后.路由规则可以设置约束 即正则表达式路 ...
随机推荐
- OpenJudge/Poj 1723 SOLDIERS
1.链接地址: http://bailian.openjudge.cn/practice/1723/ http://poj.org/problem?id=1723 2.题目: 总时间限制: 1000m ...
- JS实现div块的拖放,调换位置
主要是HTML5 的拖放(Drag 和 Drop) 例子(不需要对div设置ID): <!DOCTYPE HTML> <html> <head> <scrip ...
- CSS选择器,标签限定
例子:ul#nav, ul li#nav和 #nav ul, #nav ul li 注意空格,没有空间隔开的就可以理解为限定 区别 1.ul#nav:表示id='nav'的ul:(ul限定#nav标签 ...
- linux 定时执行 cron指令
linux 中的 cron 定时执行命令,先上例子:每间隙两分钟把 "Hello world"写到 /tmp/hello.txt crontab -e */2 * * * * ec ...
- 51nod1174区间中最大的数
1174 区间中最大的数基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中, ...
- C#基础|面向对象之继承
面向对象的世界 在现实的世界里,发现事物可以进行分类,并且各个分类中又有这关系. 在面向对象的世界里,人们用类来模拟现实世界中的各种关系. 从大的范围来说,人属于人类,如果按照不同的身份将人类进行 ...
- ext combobox getValue
使用combobox时,它有一个hiddenName的属性,专门用于提交combobox中value的值. 现假设某combobox的Id为comboId,hiddenName属性的值为hiddenV ...
- 随机产生字母a--z, A-Z 的任意组合
VERSION 1.0 引自: http://www.coderanch.com/t/134491/Security/generating-secure-tokens package demo; ...
- [JavaScript] 用html5 js实现浏览器全屏
项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的 效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以 让页面中的图片,视频等全屏目前只有g ...
- 从Clarifai的估值聊聊深度学习
从Clarifai的估值聊聊深度学习 [转载请注明出处] 前几天和 Ayden @叶瀚中 聊天时,提到了 www.clarifai.com 这家公司. 此前,我已经从各方消息中听说过创始人Matt Z ...