MVC 路由 概述

简介:

设置URL路由

URL路径中,大括号{}内部的代表参数。/作为分割符,不再大括号内的则作为常量。值得注意的是,{controller}和{action}作为2个关键字由MVC路由控制,如果确实需要用这个名字命名参数,可以在前面加上@,例如{@action}。

默认的设置路由在Global.asax文件中

public static void RegisterRoutes(RouteCollection routes)方法

routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

new { controller = "Home", action = "Index", id = UrlParameter.Optional }是MapRoute中的默认值,意思就是什么都不输入的时候,controller的值和action的值也是必须有值的。

controller代表控制器,action代表这个控制器中的方法。必须要指定默认的controller和action,不然会报错。

 routes.MapRoute(

                "Default", // Route name

                "{controller}/{action}/{id}", // URL with parameters

                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

            );

实际上是以下方法的一种简写形式:

Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary( new {

controller = "Home", action = "Index", id = UrlParameter.Optional

})

};

routes.Add("Default", myRoute);

路由的顺序也是十分重要,URL被一次匹配每个路由模式,一旦匹配成功,就不再继续匹配下去。这点要注意。例如:

routes.MapRoute(

"Default", // Route name

"{controller}/{action}/{id}", // URL with parameters

new { controller = "Home", action = "Index", // Parameter defaults

id = UrlParameter.Optional }

);

routes.MapRoute(

"Specials", // Route name

"DailySpecials/{date}", // URL with parameters

new { controller = "Catalog", action = "ShowSpecials" } // Parameter defaults

);

这里的Specials将不会被匹配到。

URL路由匹配的时候只匹配路径部分,域名和QueryString不会被匹配到。

路由约束

可以使用正则表达式对参数进行验证约束

routes.Add(new Route("Articles/{id}", new MvcRouteHandler())

{

Defaults = new RouteValueDictionary(

new { controller = "Articles", action = "Show" }

),

Constraints = new RouteValueDictionary(new { id = @"\d{1,6}",id22=@"\d{1,6}" })

});

上面部分可以简写为如下代码:

routes.MapRoute(null, "Articles/{id}",

new { controller = "Articles", action = "Show" },

new { id = @"\d{1,6}",id22=@"\d{1,6}" }

);

不定长度的路径

使用*号匹配不定长度。

 

routes.MapRoute(null, "Articles/{*articlePath}",

new { controller = "Articles", action = "Show" }

);

可以匹配/Articles/Science/Paleontology/Dinosaurs/Stegosaurus

 

匹配硬盘上的文件

尽管设置了路由,但是如果在一些特殊的情况下,硬盘上真实存在的文件和路由的URL一致,这时系统会处理硬盘真实存在的文件,而无视路由的存在。

要解决这个问题,使得无论是否匹配了真实存在的文件,都按照路由的URL来处理,应该在Application_Start()中如下写: 

protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();

            RouteTable.Routes.RouteExistingFiles = true;

            RegisterRoutes(RouteTable.Routes);

        }

RouteTable.Routes.RouteExistingFiles默认是false。

这样设置了,就算文件真实存在都会按照路由的方式处理。除了下面2种情况:

1.没有任何匹配的路由。则仍然按照真实文件处理。

2.使用了IgnoreRoute(),无视了一些路由。



















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/548518 ,如需转载请自行联系原作者



相关文章
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染4
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染4
38 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染2
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染2
33 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染3
前端学习笔记202305学习笔记第三十一天-什么是mvc-前端路由解析和渲染3
40 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定1
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定1
35 0
|
8月前
|
前端开发
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
前端学习笔记202305学习笔记第三十一天-什么是mvc-vc和路由的绑定2
29 1
|
9月前
|
开发框架 前端开发 .NET
ASP.NET Core MVC 从入门到精通之路由
ASP.NET Core MVC 从入门到精通之路由
97 0
|
前端开发 网络协议 网络架构
Gin从入门到精通—搭建MVC项目结构学习路由配置
Gin从入门到精通—搭建MVC项目结构学习路由配置
354 0
|
前端开发 中间件 .NET
asp.net core mvc 中间件之路由
asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文作为参数,调用IRouter.
1201 1
|
缓存 JavaScript 前端开发
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】
文章目录 前情概要 上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法。 使用controllerName、actionName、httpmethod获得唯一匹配的处理函数描述对象 直接上代码,看代码注释即可 //acti...
940 0
|
缓存 JavaScript 前端开发
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】
文章目录 前情概要 在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有! app.use('/myroute path', (req, res, next) => { //dosomething }) 我们难道不能再智能一点点么,学习后端mvc框架一样,比如加个标记,或者默认规则直接自动映射嘛。
1092 0