宝哥软件园

解释]ASP NET Core 2.0路由引擎

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

本文详细介绍了ASP.NET Core 2.0路由引擎,并与大家分享如下:

问题

ASP.NET酷睿2.0的路由引擎是如何工作的?

回答

创建一个空项目,并为启动类添加MVC服务和请求中间件:

public void ConfigureServices(IServiceCollection services){ services。AddMvc();} public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ app。UseMvc(routes={ routes。MapRoute(name: 'goto_one ',template: 'one ',default s 3360 new { controller=' Home ',action=' page one ' });路线。MapRoute(name: 'goto_two ',template: 'two/{id?} ',default s 3360 new { controller=' Home ',action=' page two ' });路线。MapRoute(name: 'default ',template : ' { controller=Home }/{ action=Index }/{ id?}');});}创建一个控制器HomeController来演示一般路由:

公共类Home Controller : Controller { public IActionResult Index(){ return Content(' Home/Index ');} public IActionResult page One(){ return Content(' Home/One ');}[HttpGet]public IActionResult page Two(){ return Content('(GET)Home/Two ');}[httpset]public IActionResult page two(int id){ return Content($ '(POST)Home/two : { id } ');}}创建一个控制器工作控制器来演示特征路由:

[路由('工作')]公共类WorkController :控制器{公共IActionResult Index() {返回内容('工作/索引');}[路由('一')]公共IActionResult PageOne() {返回内容(' Work/One ');}[HttpGet(' Two ')]public IActionResult page Two(){ return Content(' GET)Work/Two ');}[HttpSet(' two/{ id?} ')]public IActionResult page two(int id){ return Content($ '(POST)Work/two : { id } ');}}讨论

ASP.NET核心的路由引擎可以将传入的请求映射到控制器及其方法。这是通过向请求管道添加路由中间件来实现的,特别是通过使用IRouteBuilder将URL规则(模板)映射到控制器。

路由模板

路由模板可以使用文字和标签(标识路由参数)。匹配路由时,文字将与网址中的文本完全匹配,标签将被替换。

为了匹配模板,模板必须包含控制器和方法标签来定位控制器方法(这是MVC的核心信息)。模板中的其他标记被映射为方法的参数(通过模型绑定实现)。

添加路线图时,可以为标记提供默认值。当模板不包含控制器和方法标记时,它很有用。模板还可以包含对应于方法参数的可选标签。

让我们看一个示例模板:

联系人/{控制器=主页}/{操作=索引}/{id?}注意以下几点:

1.该标记包含在括号中。这里有三个标签,分别是控制器、动作和id。2.模板包含一个文本联系人,它与URL中的文本匹配。3.为控制器(主页)和操作(索引)提供了默认值。4.可选标签由问号声明。

以下网址将与此模板匹配:

/联系人/主页/索引/1:所有标签都有值。/contact/Home/Index:忽略了可选标记。/contact/Home:忽略操作标记,并将使用默认值Index。/contact:忽略控制器和动作标记,将分别使用它们的默认值Home和Index。常规路由

传统路由为URL路径建立了一个约定,例如给出一个模板:

1.第一标签映射到控制器2。第二个标签映射到方法3。第三个标记映射到可选的方法参数id

您也可以从模板中省略控制器和方法,只要您为它们提供默认值。例如,以下路由将被映射到地址/one,因为所需的控制器和方法标签是通过默认值提供的:

路线。MapRoute(name: 'goto_one ',template: 'one ',default s 3360 new { controller=' Home ',action=' page one ' });注意:请在常规路线之前添加此特定路线,因为路线是按定义的顺序执行的。一旦路线匹配成功,整个匹配过程将结束。

因为路由中间件只使用控制器和方法标签映射到一个控制器方法,所以在同一个控制器中放置多个同名的方法会引发异常。要解决这个问题,可以在方法上使用IActionConstraint特性(如HttpGet、HttpGet等)。):

[HttpGet(' Two ')]public IActionResult page Two(){ return Content(' GET)Work/Two ');}[HttpSet(' two/{ id?} ')]public IActionResult page two(int id){ return Content($ '(POST)Work/two : { id } ');}=====由石三开始==================================

为了观察控制器中同名方法的异常,我们首先需要修改Configure()方法,并在开发过程中添加异常处理中间件:

public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env){ if (env。IsDevelopment()) { app。usedeveloper exception page();} app。UseMvc(路由=.);}修改家庭控制器:

public IActionResult PageTwo(){返回内容('(GET)Home/Two ');} public IActionResult page two(int id){ return Content($ '(POST)Home/two : { id } ');}看似正常,但放入控制器后抛出异常的重载函数。

在浏览器地址栏中键入:http://localhost :65415/home/page two,观看异常页面:

====由石三结束===================================

特色路线

特征路由是通过直接为控制器和方法提供路由模板来实现的。

我们可以使用[Route]或[HttpGet](或其他动词)属性来指定模板。这些模板可以包含文字和标记(不是控制器和方法标记)。

在运行时,控制器的属性模板和方法的属性模板将合并在一起。例如,在工作控制器中,可以通过/work/one访问PageOne方法:

[路由('工作')]公共类WorkController :控制器{[路由('一')]公共IActionResult PageOne() {返回内容('工作/一');}}源代码下载

原文:https://tahirnaushad.com/2017/08/20/asp-net-core-mvc-routing/

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+