ASP.NET Core - 属性路由



本章我们将学习另一种路由方法:基于属性的路由。使用基于属性的路由,我们可以在控制器类及其内部方法上使用 C# 属性。这些属性包含元数据,告诉 ASP.NET Core 何时调用特定控制器。

  • 它是基于约定的路由的替代方案。

  • 路由的评估顺序与其出现的顺序(即注册顺序)相同,但是映射多个路由非常常见,特别是当您希望在 URL 中使用不同的参数或不同的文字时。

示例

让我们来看一个简单的例子。打开 **FirstAppDemo** 项目并在浏览器中运行应用程序。当您指定 **/about** 时,它将产生以下输出:

Simple Example

我们想要的是,当我们指定 **/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,对于 Phone 操作,我们指定了一个空字符串,这意味着我们不需要指定操作来获取此方法。用户只需要访问 /about 即可。对于 Country 操作,我们在路由属性中指定了“country”。让我们保存 AboutController,刷新浏览器并访问 /about,它应该会调用 Phone 操作。

Mobile Number

让我们指定 **/about/country**。这将允许您访问 Country 操作。

Same Country Result

如果您希望 URL 的一部分包含控制器的名称,您可以做的就是,不是显式使用控制器名称,而是在方括号中使用令牌 controller。这告诉 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 中一样。让我们再次保存此控制器。大多数情况下,您将看到相同的结果。

Rename the Controller

让我们指定 /about/country。这将允许您访问 Country 操作。

Rename the Controller
广告