ASP.NET Core - 属性路由
在本章中,我们将学习另一种路由方法,即基于属性的路由。 通过基于属性的路由,我们可以在我们的控制器类和这些类的内部方法上使用 C# 属性。 这些属性具有告诉 ASP.NET Core 何时调用特定控制器的元数据。
它是基于约定的路由的替代方案。
路由按照它们出现的顺序进行评估,即您注册它们的顺序,但是映射多个路由是很常见的,特别是如果您希望在 URL 中有不同的参数或者如果您想要有不同的参数 URL 中的文字。
示例
让我们举一个简单的例子。 打开 FirstAppDemo 项目并在浏览器中运行该应用程序。 当您指定 /about 时,它将产生以下输出 −
![简单的例子](https://www.w3ccoo.com/asp.net_core/images/simple_example.jpg)
我们在这里想要的是,当我们指定/about 时,应用程序应该调用AboutController 的Phone 操作。 在这里,我们可以使用 Route 属性为此控制器强制执行一些显式路由。 此属性位于命名空间 Microsoft.AspNet.Mvc 中。
以下是AboutController的实现,其中添加了属性路由。
using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Controllers { [Route("about")] public class AboutController { [Route ("")] public string Phone() { return "+49-333-3333333"; } [Route("country")] public string Country() { return "Germany"; } } }
这里我们希望这条路由看起来像 about 并且我们为电话操作指定了一个空字符串,这意味着我们不需要指定操作来获取此方法。用户只需要来到 /about。对于 Country 操作,我们在路由属性中指定了"country"。让我们保存 AboutController,刷新您的浏览器并转到 /about 并且应该给您 Phone 操作。
![手机号码](https://www.w3ccoo.com/asp.net_core/images/mobile_number.jpg)
让我们指定/about/country。 这将使您能够进行该地区的操作。
![Same Country Result](https://www.w3ccoo.com/asp.net_core/images/same_country_result.jpg)
如果您希望 URL 的一部分包含您的控制器名称,您可以做的不是显式使用控制器名称,而是可以在方括号内使用令牌控制器。 这告诉 ASP.NET MVC 在此位置使用此控制器的名称,如以下程序所示。
using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Controllers { [Route("[controller]")] public class AboutController { [Route ("")] public string Phone() { return "+49-333-3333333"; } [Route("[action]")] public string Country() { return "Germany"; } } }
这样,如果您重命名控制器,就不必记得更改路径。 动作也是如此,在控制器和动作之间隐含地有一个斜杠 (/)。 它是控制器和操作之间的层次关系,就像它在 URL 中一样。 让我们再次保存这个控制器。 您很可能会看到相同的结果。
![重命名控制器](https://www.w3ccoo.com/asp.net_core/images/rename_the_controller.jpg)
让我们指定 /about/country。 这将使您能够执行该地区的操作。
![重命名控制器](https://www.w3ccoo.com/asp.net_core/images/rename_the_controller.jpg)