ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序。这使得我们可以自定义应用程序的URL命名形式,使得它在搜索引擎优化(SEO)和链接生成中运行良好,而不用关心Web服务器上的文件是怎么组织的。我们可以方便的使用路由模板语法定义路由,路由模板语法支持路由值约束,默认值和可选值。
基于约束的路由允许全局定义应用支持的URL格式,以及这些格式是怎样各自在给定的控制器中映射到指定的操作方法(Action)。当接受到一个请求时,路由引擎解析URL并将其匹配至一个定义URL格式,然后调用相关的控制器操作方法。
routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}");
特性路由(Attribute Routing) 允许以在控制器和方法使用添加特性的方式指定路由信息来定义应用程序的路由。这意味着路由定义紧邻它们所关联的控制器和方法。
ASP.NET Core MVC 使用路由中间件来匹配传入请求的URL,并将它们映射到操作方法。路由在启动代码或属性中定义,它描述了网址路径应如何与操作方法匹配,还用于响应中生成链接并发送。
1.设置路由中间件
创建一个ASP.NET Core Web应用程序,在Startup类的Configure方法中有:
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
在对UseMvc的调用过程中,MapRoute用于创建单个路由,即默认路由。大多数MVC应用程序都使用与默认路由模板类似的路由。
路由模板{controller=Home}/{action=Index}/{id?} 可以匹配类似 Blog/Details/5 的URL路径,并且提取路由值 {controller=Blog,action=Details,id=5} 。MVC将尝试查找名为BlogController的控制器,并运行操作方法。
{controller=Home}将Home定义为默认控制器
{action=Index}将Index定义为默认操作
{id?}将id定义为可选
默认路径参数和可选路径参数可以不出现在需要匹配的URL路径中。
使用{controller=Home}/{action=Index}/{id?}模板,可以对以下URL路径都执行HomeController.Index:
/Home/Index/7
/Home/Index
/Home
/
有个简单方法 app.UseMvcWithDefaultRoute() 可以替换掉上面的方法。
UseMvc 和 UseMvcWithDefaultRoute 都是将RouteMiddleware的实例添加到中间件管道。MVC不直接与中间件交互,而是使用路由来处理请求。MVC通过MvcRouteHandler的实例链接到路由。下面的代码与UseMvc类似:
var route = new RouteBuilder(app); //添加连接到MVC,通过调用MapRoute来回调 route.DefaultHandler = new MvcRouteHandler(...); //执行回调以注册路由 route.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); //创建路由集合并添加至中间件 app.UseRouter(route.Build());
UseMvc 不直接定义任何路由,它为属性路由的路由集合添加一个占位符。重载UseMvc 使得我们可以添加自己的路由,并且还支持属性路由。UseMvc 及其所有变体为属性路由添加了占位符,这使得属性路由始终可用。UseMvcWithDefaultRoute定义默认路由并且支持属性路由。
2.常规路由
routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}"); 这是一个常规路由,因为它建立了一个约定的URL路径:
第一路径段映射到控制器名称
第二路径映射到操作名称
第三区段是可选id,用于映射到模型实体
使用default路由,URL 路径 /Blog/Index 将映射到BlogController.Index 操作。该映射是基于控制器和操作名称,而不是基于命名空间,源文件位置等。
使用常规路由的默认路由可以快速构建应用程序,而无需定义每一个操作的路由。对于CRUD 操作风格的应用程序,整个控制器的URL具有一致性。
3.多路由
可以在UseMvc 里面通过添加MapRoute 来添加多个路由。这样可以定义多个约定,或添加专用于特定操作的常规路由:
app.UseMvc(routes => { routes.MapRoute("blog", "blog/{*article}", defaults: new { Controller = "Blog", Action = "Index" }); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
这里的blog 路由是专用常规路由,这意味着它不采用常规路由系统,而是专用于一个特定地的动作。这个路由始终映射到BlogController.Index。
路由集合中的路由是有序的,并且会按照它们被添加的顺序进行处理。
1.回退
作为请求处理的一部分,MVC将验证路由值是否可以用来查找应用程序中的控制器和操作。如果路由值不匹配操作,那么该路由被认为是不匹配的,将尝试下一个路由。这一过程称为回退,因为常规路由有重叠的情况。
2.行动歧义
当两个一致的操作通过路由时,MVC必须消除歧义,选择最佳操作,否则会抛出异常。例如: