覆盖ASP.NET Core中的控制器名称

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)

Tse*_*eng 7

如果您不想从 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)


juu*_*nas 7

这样的属性不存在.但你可以自己创建一个:

[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属性是错误的.