如何在ASP.NET Core中使用属性路由

利用ASP.NET Core中基于属性的路由,将控制器名称和操作名称与路由模板分离,并在路由中提供更大的灵活性

如何在ASP.NET Core中使用属性路由

ASP.NET Core中的路由中间件擅长将传入的请求映射到相应的路由处理程序。您可以通过两种不同的方式在ASP.NET Core中设置路由:基于属性的路由和基于约定的路由。

与基于约定的路由不同,后者在单个位置指定路由信息,而属性路由使您可以通过用属性修饰动作方法来实现路由。本文讨论了如何在ASP.NET Core MVC中使用基于属性的路由。

ASP.NET Core MVC中创建控制器类

创建一个名为DefaultController的新控制器,并将DefaultController的默认源代码替换为以下代码:

   public class DefaultController : Controller
    {
        [Route("")]
        [Route("Default")]
        [Route("Default/Index")]
        public ActionResult Index()
        {
            return new EmptyResult();
        }
        [Route("Default/GetRecordsById/{id}")]
        public ActionResult GetRecordsById(int id)
        {
            string str = string.Format
            ("The id passed as parameter is: {0}", id);
            return Ok(str);
        }
    }

在ASP.NET Core中的控制器级别使用属性路由

属性路由既可以在控制器级别也可以在操作方法级别使用。如果我们在控制器级别应用route属性,则该路由适用于该控制器的所有操作方法。

如果检查我们的DefaultController类,您将发现在为操作方法指定路由模板时多次使用Default路由。以下代码段显示了如何在控制器级别指定不同的路由属性,以更灵活地使用属性路由

[Route("Default")]   
public class DefaultController : Controller
{
  [Route("")]
  [Route("Index")]
  public ActionResult Index()
  {
      return new EmptyResult();
   }
  [HttpGet]
  Route("Default/GetRecordsById/{id}")]
  public ActionResult GetRecordsById(int id)
  {
      string str = string.Format("The id passed as parameter is: {0}", id);
      return Ok(str);
   }
}

在控制器级别和操作方法级别上同时使用路由属性时,在控制器级别应用的路由模板会被添加到在操作方法级别指定的路由模板之前。

您可能经常需要为控制器添加一个通用前缀。完成后,应使用[RoutePrefix]属性,如下面给出的代码片段所示。

[[RoutePrefix("services")]
public class HomeController : Controller
{
   //Action methods
}

在ASP.NET Core中的操作方法级别使用属性路由

请参考上面显示的DefaultController类。如您所见,我们在DefaultController类的Index方法中指定了三个路由。这意味着以下每个URL都将调用DefaultController的Index()操作方法。

http:// localhost:11277
http:// localhost:11277 / home
http:// localhost:11277 / home / index

与基于约定的路由一样,您也可以在基于属性的路由中指定参数。换句话说,基于属性的路由允许您使用参数指定路由属性。前面显示的DefaultController类的GetRecordsById操作方法是一个示例。

请注意,指定路径中的“ {id}”代表参数或占位符。此示例中的id参数可以是任何东西,例如字符串或整数。如果您想将参数限制为仅整数该怎么办?您可以通过使用约束来实现。

在操作方法中使用属性路由约束

路由约束用于阻止对控制器操作的无效请求。例如,您可能要确保传递给操作方法的参数始终是整数。使用路由约束的语法为{parameter:constraint}。以下代码段对此进行了说明。请注意,此处的id参数始终是整数。

[Route("Default/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
  string str = string.Format("The id passed as parameter is: {0}", id);
  return Ok(str);
}

属性路由规范中使用可选参数

您也可以在路由说明中使用可选参数。以下代码片段显示了如何实现此目的。请注意,即使没有传递id参数,在这种情况下的action方法也将被执行。

[Route("Sales/GetSalesByRegionId/{id?}")]

重要的是要理解,在使用属性路由时,控制器名称和动作方法名称都不会在选择执行哪种动作方法时起任何作用。让我们来看一个例子。以下代码段说明了如何在GetRecordsById操作方法的路由规范中更改URL。

[Route("Home/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
   string str = string.Format("The id passed as parameter is: {0}", id);
   return Ok(str);
}

现在,您可以使用以下URL调用GetRecordsById操作方法:

http:// localhost:11277 / home / GetRecordsById / 1

在操作方法中使用多个属性路由约束

也可以对参数应用多个约束。以下代码段说明了如何实现此目的。请注意,id参数的最小值应为1,否则将返回404错误。

[Route("Default/GetRecordsById/{id:int:min(1)}")]
public ActionResult GetRecordsById(int id)
{
    string str = string.Format("The id passed as parameter is: {0}", id);
    return Ok(str);
}

在动作方法中的属性路由中使用HTTP动词

您甚至可以在属性路由中使用HTTP动词。以下代码片段显示了如何实现此目的。

[HttpGet]
[Route("Default/GetRecordsById/{id:int:min(1)}")]
public ActionResult GetRecordsById(int id)
{
  string str = string.Format("The id passed as parameter is: {0}", id);
  return Ok(str);
}

常用的属性路由约束 

这是ASP.NET Core中最常用的路由约束的列表。 

  • bool-用于匹配布尔值
  • datetime-用于匹配DateTime值
  • 十进制-用于匹配十进制值
  • double-用于匹配64位浮点值
  • float-用于匹配32位浮点值
  • guid-用于匹配GUID值
  • int-用于匹配32位整数值
  • long-用于匹配64位整数值
  • max-用于匹配具有最大值的整数
  • min-用于匹配具有最小值的整数
  • minlength-用于匹配最小长度的字符串
  • regex-用于匹配正则表达式

创建自定义属性路由约束 

您还可以通过创建一个扩展IRouteConstraint接口并实现Match方法的类来创建自己的自定义路由约束,如下面的代码片段所示。

public class CustomRouteConstraint : IRouteConstraint
    {
        public bool Match(HttpContext httpContext, IRouter route,
        string routeKey,
        RouteValueDictionary values, RouteDirection routeDirection)
        {
            throw new NotImplementedException();
        }
    }

在控制器级别的属性路由中使用令牌替换

ASP.NET Core MVC中的属性路由提供了对另一个有趣的功能的支持,该功能称为令牌替换。您可以在控制器中使用标记[action],[area]和[controller],这些标记将分别替换为动作,区域和控制器名称。以下代码段说明了如何实现此目的。

[Route("[controller]/[action]")]
public class HomeController : Controller
{
   private readonly ILogger<HomeController> _logger;
   public HomeController(ILogger<HomeController> logger)
   {
       _logger = logger;
   }
   public IActionResult Index()
   {
       return View();
   }
   //Other action methods
}

ASP.NET Core中的属性路由为您提供了对Web应用程序中URI的更多控制和灵活性。尽管可以在单个位置配置基于约定的路由,然后可以将其应用于应用程序中的所有控制器,但是使用基于约定的路由来支持某些URI模式(例如API版本控制)是很困难的。

通过使用属性路由,可以将控制器名称和操作名称与路由模板分离。您甚至可以在ASP.NET Core应用程序中结合使用基于约定的路由和基于属性的路由。

原创文章,作者:冰封一夏,如若转载,请注明出处:http://www.nncjzx.com/1412.html

关注本站公众号获取更多实时内容

本站微信公众号:二线码农