第1节. 概述
在asp.net mvc 5中利用路由机制可以很好的实现url地址的自定义。最初在学习ASP.NET MVC框架的时候,使用的URL访问时都是默认的路由,使用控制器/操作方法的方式来访问,其实这是一种逻辑URL,这里主要讨论如何将逻辑URL映射到控制器的操作方法上。
第2节. URL
URL又称为统一资源定位符。访问每个web应用程序、ftp等,都会使用一个独立的URL来定位。
一个好的URL应该具有如下特点:
(1). 域名有意义且容易记住。
(2). 一定要简短,越短越好。
(3). 通过域名能够清楚反馈出网站的功能。
(4). 具有永久性,不可修改的。
在我们学习ASP.NET WebForms框架时,所有的URL后缀都是以.aspx结尾的,这样一眼就能看出这是使用ASP.NET Webform框架开发出来的应用程序。并且这个.aspx在每个URL中都存在。但是对于用户来说,还得多输入.aspx来完成访问,如果能将.aspx省略,其不更好。最重要的是这些文件都是存放在物理磁盘上的。
而在ASP.NET MVC 5中,用户访问的URL都是逻辑URL,只是映射到控制器和操作方法上,相对aspx页面,更加灵活。
第3节. 路由概述
在ASP.NET MVC 5 中,所有的访问都是通过路由来实现的,路由就像是火车站上车次表一样,想去的地方可能有多条路径,应该选择最佳路径去访问。具有如下2种用途:
(1). 根据输入的Url地址,匹配传入的URL,并根据路由映射到控制器和操作方法上。
(2). 生成可以访问的URL,用来响应控制器给出的操作。
一、 对比路由和URL重写
URL重写是将一个新的URL地址通过障眼法变成另一个URL地址,这种重写只是换了个URL地址而已,真正访问的地址还是原来的。
而路由则是将URL映射到具体的资源,如控制器中的操作方法,就是一种资源。
二、 路由的定义
ASP.NET MVC 5中的路由定义,其实只是定义一个匹配模式,是一个路由模板,与正则表达式的定义有些类似,每个软件系统都有一套自己的路由模式,而在具体访问时,则是需要与该模式匹配,匹配上了就可访问,否则不能访问。
根据路由匹配模式,再定义出合适的URL地址与之匹配而被访问到。
三、 路由URL
当我们使用Visual Studio 2019 IDE开发工具创建一个ASP.NET MVC5应用程序后,就会自动生成一个Global.asax全局配置文件。该文件主要配置整个项目的全局数据。
其中有一行代码是用来注册路由的:
//注册路由RouteConfig.RegisterRoutes(RouteTable.Routes);
所注册的路由RouteConfig类在根目录下的App_Start文件夹的RouteConfig.cs文件中:
默认就存在一个路由,此路由定义C#代码如下:
routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
对于路由的定义,要写在MapRoute 的url属性中,并且其值使用{}括起来的字符串表示,其中每一个{}就是一个URL参数,并且必须使用一个特定的符号分隔,默认是使用/分隔的,当然也可以使用其它符号分隔。
这里使用了-来分隔路由的URL。现在访问一下:
此时我们发现,使用/分隔URL参数是不能访问的,将URL现在改成-分隔,再试着访问一下:
此时,奇迹发现了,当将URL中的/改成-后,可以正常访问了,这是因为在路由模式中,匹配到了正确的路径,所以找到了控制器和操作方法,页面就被访问到了。
四、 路由值
在ASP.NET MVC 5框架中要求使用一些特定的参数名称:{Controller}和{action},其中{Controller}模式表示匹配控制器,{action}模式表示匹配操作方法。匹配模式不区分大小写。
例如:{controller}-{action}-{id}
可以匹配URL:Student-Add-100,其中Student是控制器名称,Add是操作方法名称,100是id的参数值。
如果URL需要使用固定的名称开头,则可以使用如下路由URL匹配模式:
"yido-{controller}-{action}-{id}"
此模式表示必须以yido开头,然后才是控制器和操作方法以及参数。
另外,分隔符可以是多个混合使用:"yd/{controller}-{action}-{id}"
注意:{controller}{action}{id}URL模式是不正确的,原因是没有分隔符的路由URL是不正确的,并且并不是所有的符号都能作为路由URL的分隔符。
五、 路由默认值
对于路由的默认值是指并不需要在URL上全部将默认地址写全访问。而是可以省略访问的。
使用defaults属性在MapRoute()中配置路由的默认值,其默认值的配置是一个匿名类。
如果指定默认的控制器是Home,操作访问是Index,id是可选参数。这样对于:/Home/Index/100的访问完全可以使用/来替代:
此时,我们在URL地址上是没有看到Home和Index的,只是一个端口号,后面什么也没有了,这就是默认值所起的作用。
六、 路由约束
对于ASP.NET MVC 5中的路由URL模式匹配,是可以使用正则进行约束的。
例如,有此URL地址:/2020/03/21/,在此URL中,最后的年/月/日的值,可以使用路由约束来设置。
context.MapRoute(name: "AreaUser_default",url: "{controller}/{action}/{year}/{month}/{day}",defaults: new { controller = "RegisterUser", action = "Index", year = UrlParameter.Optional, month = UrlParameter.Optional, day = UrlParameter.Optional },constraints: new { year = @"[1-2][0-9]{3}", month = @"(0[1-9]|1[0-2])", day = @"[0-3][0-9]" });
在MapRoute()方法中,使用constraints来指定约束,是一个匿名类:
new { year = @"[1-2][0-9]{3}", month = @"(0[1-9]|1[0-2])", day = @"[0-3][0-9]" }
这样就将year、month、day进行了约束,只能用来表示年月日的值才能是正确的URL值。
注意:如果添加了约束,则可选参数就不能省略了,否则出现404错误。
通过以上的学习,我们清楚了路由机制是如何在ASP.NET MVC 5框架中流转的,这样对于整个项目的URL地址规划是有很大帮助的,不至于开发到中途出现修改URL的情况。
举报/反馈