ASP.NET Core - 属性路由


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

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

  • 路由按照它们出现的顺序和注册它们的顺序进行评估,但是映射多个路由是很常见的,特别是如果您希望在 URL 中具有不同的参数或希望在 URL 中具有不同的文字。

例子

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

简单的例子

我们想要的是,当我们指定/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。对于国家/地区操作,我们在路由属性中指定了“国家/地区”。让我们保存 AboutController,刷新浏览器并转到 /about,应该会为您提供“电话”操作。

手机号码

让我们指定/about/country。这将使您能够进行该国家/地区的操作。

相同国家/地区结果

如果您希望 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 中一样。让我们再次保存这个控制器。您很可能会看到相同的结果。

重命名控制器

让我们指定/about/country。这将使您能够进行该国家/地区的操作。

重命名控制器