[译]ASP.NET Core 2.0 路由引擎详解
更新时间:2017年11月01日 11:52:21 作者:三生石上(FineUI控件)
本篇文章主要介绍了[译]ASP.NET Core 2.0 路由引擎,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文介绍了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?}
注意如下几点:
1.标记包含中大括号中。这里有三个标记,分别是controller,action和id。
2.模板中包含一个字面值contact,它会匹配URL中的文本。
3.已经为controller(Home)和action(Index)提供了默认值。
4.可选标记通过问号来声明。
下面的URL会匹配这个模板:
/contact/Home/Index/1: 所有标记都有值。
/contact/Home/Index: 忽略了可选标记。
/contact/Home: 忽略了action标记,将使用默认值Index。
/contact: 忽略了controller和action标记,将分别使用其默认值Home和Index。
常规路由
常规路由为URL路径建立一个约定, 例如给定一个模板:
1.第一个标记映射到控制器
2.第二个标记映射到方法
3.第三个标记映射到可选的方法参数id
你也可以从模板中省略控制器和方法,只要你为它们提供缺省值就行了。比如下面的路由会映射到地址/one,因为通过defaults提供了所需的控制器和方法标记:
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}”);
}
看似很正常的重载函数,但是放到控制器中会抛出异常。
在浏览器地址栏敲入: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”);
}
}
源代码下载
原文:tahirnaushad.com/2017/08/20/asp-net-core-mvc-routing/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。
您可能感兴趣的文章:asp.net Core3.0区域与路由配置的方法ASP.NET Core MVC学习教程之路由(Routing)详解ASP.NET Core MVC 源码学习:Routing 路由ASP.NET Core 2.2中的Endpoint路由详解.Net Core路由处理的知识点与方法总结
ASP.NET
Core
2.0
路由引擎
相关文章
ASP.net(c#)用类的思想实现插入数据到ACCESS例子ASP.net(c#)用类的思想实现插入数据到ACCESS例子… 2007-07-07
ASP.NET MVC下拉框联动实例解析这篇文章主要为大家详细介绍了ASP.NET MVC下拉框联动实现方法,感兴趣的小伙伴们可以参考一下 2016-07-07
在GridView中LinkButton的属性的应用(如何不用选中就删除这一行GridView中LinkButton的属性的应用,实现不用选中就删除这一行 2009-04-04
Global.asax的Application_BeginRequest实现url重写无后缀的代码本文为大家详细介绍下利用Global.asax的Application_BeginRequest 实现url重写其无后缀,具体核心代码如下,有需求的朋友可以参考下,希望对大家有所帮助 2013-08-08
ASP.NET中弹出消息框的几种常见方法这篇文章主要介绍了ASP.NET中弹出消息框的几种常见方法,给出了几种常见的弹出消息框的方法,并总结对比了几种方法的特点,具有一定的参考借鉴价值,需要的朋友可以参考下 2014-11-11
.NET 中Worker Service的使用入门随着 .NET Core 3.0 的发布,ASP.NET 团队引入了一个新的 Worker Service 项目模板,该模板作为 .NET SDK 的一部分发布。在本文中,我将向您介绍这个新模板,以及使用它开发的一些实际的服务示例。 2021-05-05
asp.net ListView交替背景颜色实现代码在asp.net中ListView的交替背景颜色实现,GridView的处理得较多,ListView可以这样实现。
2010-02-02
web.config中配置数据库连接的方式Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。本文主要介绍web.config中配置数据库连接的两种方式,一起来看。 2015-10-10
asp.net 枚举文件里面的数字绑定到DropDownList里面去将枚举文件里面的数字绑定到DropDownList里面去的实现方法,大家可以借鉴下。 2009-07-07
ASP.NET MVC处理文件上传的小例子这篇文章介绍了ASP.NET MVC处理文件上传的小例子,有需要的朋友可以参考一下 2013-10-10
最新评论

评论(0)