gro*_*kky 2 c# attributerouting asp.net-core-mvc asp.net-core
与此问题类似,但对于新的ASP.NET Core.
我可以覆盖一个动作的路由名称:
[ActionName("Bar")]
public IActionResult Foo() {
Run Code Online (Sandbox Code Playgroud)
我可以使用属性路由为控制器执行此操作吗?
[?("HelloController")]
public SomeController : Controller {
Run Code Online (Sandbox Code Playgroud)
它应该允许使用标记助手生成链接:
<a asp-controller="some" ... // before
<a asp-controller="hello" ... // after
Run Code Online (Sandbox Code Playgroud)
如果您不想从 Controller 类派生控制器名称(Classname 减去 Controller 后缀),则只需省略[controller]占位符。
[Route("/api/hello")]
public SomeController : Controller {
[HttpGet]
public IActionResult Get() { }
[HttpGet("something")]
public IActionResult GetSomething() { }
}
Run Code Online (Sandbox Code Playgroud)
中的重载HttpGet将设置操作名称。但是,这样做,您不能使用通用路由,例如
routes.MapRoute("default", "api/{controller}/{id?}");
Run Code Online (Sandbox Code Playgroud)
或者你必须在那里手动注册
routes.MapRoute("hello", "api/hello/{id?}", defaults: new { controller = "Hello" });
routes.MapRoute("default", "api/{controller}/{id?}");
Run Code Online (Sandbox Code Playgroud)
这样的属性不存在.但你可以自己创建一个:
[AttributeUsage(AttributeTargets.Class)]
public class ControllerNameAttribute : Attribute
{
public string Name { get; }
public ControllerNameAttribute(string name)
{
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
将其应用于您的控制器:
[ControllerName("Test")]
public class HomeController : Controller
{
}
Run Code Online (Sandbox Code Playgroud)
然后创建自定义控制器约定:
public class ControllerNameAttributeConvention : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
var controllerNameAttribute = controller.Attributes.OfType<ControllerNameAttribute>().SingleOrDefault();
if (controllerNameAttribute != null)
{
controller.ControllerName = controllerNameAttribute.Name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并将其添加到Startup.cs中的MVC约定:
services.AddMvc(mvc =>
{
mvc.Conventions.Add(new ControllerNameAttributeConvention());
});
Run Code Online (Sandbox Code Playgroud)
现在,HomeController索引行动将作出回应/Test/Index.可以根据需要设置Razor标记助手属性.
唯一的缺点是至少ReSharper在Razor中有点破碎.它不知道约定,所以它认为asp-controller属性是错误的.