本文介绍了ASP.NET Core 2.0 路由引擎详解,分享给大家,具体如下:
问题
ASP.NET Core 2.0的路由引擎是如何工作的?
答案
创建一个空项目,为Startup类添加MVC服务和请求中间件:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(routes => { routes.MapRoute( name: "goto_one", template: "one", defaults: new { controller = "Home", action = "PageOne" }); routes.MapRoute( name: "goto_two", template: "two/{id", defaults: new { controller = "Home", action = "PageTwo" }); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id"); }); }
创建一个控制器HomeController,来演示常规路由:
public class HomeController : Controller { public IActionResult Index() { return Content("Home/Index"); } public IActionResult PageOne() { return Content("Home/One"); } [HttpGet] public IActionResult PageTwo() { return Content("(GET) Home/Two"); } [HttpPost] public IActionResult PageTwo(int id) { return Content($"(POST) Home/Two: {id}"); } }
创建一个控制器WorkController,来演示特性路由:
[Route("work")] public class WorkController : Controller { public IActionResult Index() { return Content("Work/Index"); } [Route("one")] public IActionResult PageOne() { return Content("Work/One"); } [HttpGet("two")] public IActionResult PageTwo() { return Content("(GET) Work/Two"); } [HttpPost("two/{id")] public IActionResult PageTwo(int id) { return Content($"(POST) Work/Two: {id}"); } }
讨论
ASP.NET Core的路由引擎可以将传入的请求映射到控制器和它们的方法中。这是通过向请求管道中添加路由中间件实现的,具体来说是使用IRouteBuilder将URL规则(模板)映射到一个控制器的方法。
路由模板
路由模板可以使用字面值和标记(标识路由参数)。在匹配一个路由时,字面值会严格匹配URL中的文本,而标记会被替换掉。
为了匹配一个模板,模板中必须包含控制器和方法标记以便定位控制器方法(这是MVC的核心信息)。模板中的其它标记被映射为方法的参数(通过模型绑定实现)。
当添加一个路由映射时,可以为标记提供缺省值。当模板中不包含控制器和方法标记时会很有用。模板也可以包含对应于方法参数的可选标记。
让我们来看一个示例模板:
contact/{controller=Home}/{action=Index}/{id"htmlcode">routes.MapRoute( name: "goto_one", template: "one", defaults: new { controller = "Home", action = "PageOne" });注:请将此特定路由添加到通用路由之前,因为路由是按照定义的顺序执行的,一旦某个路由匹配成功,则整个匹配流程就会终结。
由于路由中间件只使用了控制器和方法标记来映射到一个控制器方法,因此同一个控制器中放置多个同名的的方法将会抛出异常。为了解决这个问题,可以使用方法上的IActionConstraint特性(比如HttpGet,HttpPost等特性):
[HttpGet("two")] public IActionResult PageTwo() { return Content("(GET) Work/Two"); } [HttpPost("two/{id")] public IActionResult PageTwo(int id) { return Content($"(POST) Work/Two: {id}"); }====start by sanshi=========================
为了观察控制器中同名方法出现的异常,我们首先需要修改Configure()方法,添加开发时异常处理中间件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(routes => ....); }修改HomeController:
public IActionResult PageTwo() { return Content("(GET) Home/Two"); } public IActionResult PageTwo(int id) { return Content($"(POST) Home/Two: {id}"); }看似很正常的重载函数,但是放到控制器中会抛出异常。
在浏览器地址栏敲入:http://localhost:65415/Home/PageTwo,观看到异常页面:
====end by sanshi=========================
特性路由
特性路由通过直接为控制器和方法提供路由模板来实现。
我们可以使用[Route]或者[HttpGet](或者其他动词)特性来指定模板。这些模板可以包含字面值和标记(不能包含控制器和方法标记)。
运行时,控制器的特性模板和方法的特性模板会被合并到一起,比如,在WorkController中,PageOne方法可以通过/work/one访问:
[Route("work")] public class WorkController : Controller { [Route("one")] public IActionResult PageOne() { return Content("Work/One"); } }源代码下载
原文:https://tahirnaushad.com/2017/08/20/asp-net-core-mvc-routing/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!