ASP.NET MVC路由详解
1.什么是路由
一种URL(统一资源定位符)的体现方式,将URL映射到方法的调用。
在 Web Form 应用,每个 URL 必须匹配一个 .aspx 物理文件,如:http://domain/bar.aspx 必须有一个用于响应渲染的文件 bar.aspx。ASP.Net MVC 则通过引入 Routing 来消除必须使用物理文件映射 URL 的弊端。路由使我们能够定义映射到请求处理程序的 URL 模式。请求处理程序在 WebForm 中是 .aspx 文件,在 MVC 中是 Controller 以及 Action 方法。例如:http://domain/foo
注:路由并非mvc专属,它是建立在.NET Framework上的一个组件。
2.使用路由的优势
①根据系统需求,灵活的划分请求规则
②防止注入式攻击,提高安全性。传统URL和磁盘上的文件一一对应,通过URL就能确定站点目录,而路由把请求映射到控制器。
③利于搜索引擎优化,可以将URL请求统一规范,以后维护中,如果页面发生变化,URL可以保持不变。
3.如何定义路由
新建一个空的ASP.NET MVC项目,目录如下:
双击打开Global.asax,如下:
注:Application_start()是程序入口方法,只在打开网站时执行一次。
RouteConfig.cs文件位于App_Start文件夹中,如下:
路由模板指的是:域名+端口号之后的内容。
MVC工作过程:
一、URL模式
上面的 URL 中的参数值是:“{controller}/{action}/{id}”,称之为 URL 模式。
占位符:字符或字符串,如“x”、“id”、“year”等。
字面量:字符或字符串,最常见的是“/”。
注:不能以“/”或“~”开头,不能包含“?”,占位符不能连续。
URL模式示例总结:
匹配要求:
1.字面量必须完全一致。
2.不区分大小写。
3.没有包含在大括号内的信息作为常量看待,如上面的Course。
定义多个URL模式的路由:
注:如果一个URL能匹配多个路由,则默认使用第一个匹配的路由。
UrlPrameter.Optional的作用是作为id的默认值,并可以让“/Home/Index”或“/Home”能正常匹配。
关于占位符:
示例:https://www.cnblogs.com/1016391912pm/p/12088733.html
{controller}和{action}是必不可少的,controller代表控制器(示例中的Test),action代表方法(示例中的Index),如果没有定义的话就会因找不到路径而出错。
像{aa}/{bb}/{cc}这种占位符只是起到占位作用,系统不会将其解析为控制器或方法。
路由数据的存储和映射
在ASP.NET MVC中,路由数据存储在RouteData中,方式为键值对,和字典相似。
路由数据:RouteDate.Values 是RouteValueDictionary类型。RouteData定义为视图和控制器基类的属性。
可以在视图中遍历RouteData.Values,如下:
输出:
*匹配
用*来匹配 URL 剩余部分,示例代码如下:
路由约束
constraints代表约束:
二、特性路由
1.简单的特性路由
在RegisterRoutes方法中添加:
routes.MapMvcAttributeRoutes();
在控制器类中的方法上添加特性:
我们在浏览器中就可以通过地址http://localhost:46198/haha来运行这个方法,并指向视图中的Index.cshtml
可以设置多个特性,则可以通过每一个特性名来访问。
2.使用占位符
可以通过http://localhost:46198/hello/1来访问Second方法
3.为每一个方法设置路由
有时一个控制器中的路由遵循相似的路由模板,可以这样设置:
这样控制器类中的方法都可以通过home/方法名来访问。(可以在方法名上重新设置,覆盖这种方式)
4.路由约束
对于[Route("home/{id}")],我们希望的是id是int类型的,则可以这样设置:[Route("home/{id:int}")]
一些内联约束:
5.路由默认值
[Route("home/{action=Index}")]