📅  最后修改于: 2020-11-21 04:56:21             🧑  作者: Mango
在本章中,我们将学习另一种路由方法,即基于属性的路由。通过基于属性的路由,我们可以在控制器类以及这些类内部的方法上使用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";
}
}
}
在这里,我们希望此路由看起来像,对于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。这将使您可以执行该国家/地区行动。