ASP.NET MVC学习(1)路由篇Route
什么是路由
通过【路由】配置,路由可以规定URL的特殊格式,使其达到特殊效果。
在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法中,执行相应操作,并接受URL中传过来的参数,
在MVC5框架中,在【RouteConfig.cs】类中进行路由规则的配置
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
参数的含义
(1) name: 要映射的路由的名称。
(2) url: 路由的 URL 模式,可以自定义路由的格式,可以写静态路由,也可以写动态路由、组合路由等。
(3) defaults: 一个包含默认路由值的对象,书写路由的默认值。
(4) constraints: 一组表达式,可以使用正则指定 url 参数值的约束。
(5) namespaces: 应用程序的一组命名空间,可以缩小检索路由对象匹配的范围。
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) { if (routes == null) { throw new ArgumentNullException("routes"); } if (url == null) { throw new ArgumentNullException("url"); } Route route = new Route(url, new MvcRouteHandler()) { Defaults = CreateRouteValueDictionaryUncached(defaults), Constraints = CreateRouteValueDictionaryUncached(constraints), DataTokens = new RouteValueDictionary() }; ConstraintValidation.Validate(route); if ((namespaces != null) && (namespaces.Length > 0)) { route.DataTokens["Namespaces"] = namespaces; } routes.Add(name, route); return route;
MVC中的几类路由及其规则
动态路由
routes.MapRoute( name: "Default", //路由名称 url: "{controller}/{action}/{id}", //路由规则 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional } //默认值,当Controller或action为空(省略)的时候调用 );
静态路由
routes.MapRoute( name: "Default2", //路由名称 url: "Ypf", //路由规则,不区分大小写,当输入“ypf”时,会自动跳转到下面的地址 defaults: new { controller = "First", action = "Index1", id = UrlParameter.Optional } //默认值,当Controller或action为空的时候调用 );
组合路由
routes.MapRoute( "Default4", //路由名称 "Ypf/{action}", //路由规则,不区分大小写,规则相符的时候,会自动跳转到下面的地址 new { controller = "First", action = "Index1" } );
正则约束
routes.MapRoute( "Default5", "{controller}/{action}_{Year}_{Month}_{Day}", new { controller = "First", action = "Index1", id = UrlParameter.Optional }, new { Year = @"^\d{4}", Month = @"\d{2}", Day = @"\d{2}" } );//正则路由
所谓的正则约束,是指可以对URL中的参数使用正则表达式进行约束,上述代码约束了Year必须是四位数字,Month和Day必须是两位数字。
命名空间约束
routes.MapRoute( name: "Default6", url: "{controller}/{action}/{id}", defaults: new { controller = "Third", action = "Index", id = UrlParameter.Optional }, namespaces: new string[] { "Ypf.MVC5" } );
所谓的命名空间约束,即限定匹配范围路由的检索范围,提高检索速度。
特别注意:不能从外层控制器直接跳转到内层Area内的控制器!!
Area区域内的路由
public override void RegisterArea(AreaRegistrationContext context) { //原路由 //context.MapRoute( // "TestOne_default", // "TestOne/{controller}/{action}/{id}", // new { action = "Index", id = UrlParameter.Optional } //); //结合命名空间进行路由改造 context.MapRoute( this.AreaName + "_default", this.AreaName + "/{controller}/{action}/{id}", new { area = this.AreaName, controller = "Sys_Admin", action = "Index", id = UrlParameter.Optional }, new string[] { "Ypf.MVC5.Areas." + this.AreaName + ".Controllers" } ); }
其他
1.URL路径和路由配置中的路径对比
2.由上面的图,我们可以得出下面的一组路由数据
3.二义性
如果我们在Models中也新建一个Home控制器,那么你会发现重新刷新之后报错了。而这个是因为无法确定到底选择哪个控制器来响应该请求的缘故,当然你认为只要我们不新建重名的控制器就可以了,这样你只能控制你的项目中不出现,但是你却无法控制你加载的类库中不会出现,但是ASP.NET MVC已经提供了解决方案给我们,如下改正
RouteConfig.cs:
1 2 3 4 5 6 7 8 9 10 11 12 | public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( name: "Default" , url: "{controller}/{action}/{id}" , defaults: new { controller = "Home" , action = "Index" , id = UrlParameter.Optional }, namespaces: new [] { "MvcStudy.Controllers" } ); } } |
我们可以看到namespaces参数,通过将命名空间的名称传进去就可以起到排除二义性的问题了。
4.约束路由
上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( name: "Default" , url: "{controller}/{action}/{id}" , defaults: new { controller = "Home" , action = "Index" , id = UrlParameter.Optional }, constraints: new {id = @"^\d*$" }, namespaces: new [] { "MvcStudy.Controllers" } ); } } |
5.URL路由机制
6.MVC Area出现找到多个与名为Home的控制器匹配的类型错误的解决方法
第一种方式:在RouteConfig中添加路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" ); routes.MapRoute( name: "Admin" , url: "Admin/{controller}/{action}/{id}" , defaults: new { controller = "Home" , action = "Index" , id = UrlParameter.Optional }, namespaces: new string [] { "ASP.NETMVCProject.Areas.Admin.Controllers" } //添加命名空间 ); routes.MapRoute( name: "Default" , url: "{controller}/{action}/{id}" , defaults: new { controller = "Home" , action = "Index" , id = UrlParameter.Optional }, namespaces: new string [] { "ASP.NETMVCProject.Controllers" } //添加命名空间 ); } } |
第二种方式:在AdminAreaRegistration中添加命名空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin" ; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default" , "Admin/{controller}/{action}/{id}" , new { action = "Index" , id = UrlParameter.Optional }, namespaces: new string [] { "ASP.NETMVCProject.Areas.Admin.Controllers" } //添加命名空间 ); } } |
7.显示禁用路由
8.自定义路由
routes.MapRoute( "Detail",// Route name "Expert/Detail/{q}.htm",// URL with parameters new { controller = "Expert", action = "Detail", q = "" }// Parameter defaults );
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!