【问题标题】:How do override ASP.NET Core's controller naming convention?如何覆盖 ASP.NET Core 的控制器命名约定?
【发布时间】:2017-05-12 16:36:42
【问题描述】:

我正在使用 ASP.NET Core。约定是路由系统将FooController 类视为名称为Foo 的控制器。

我需要重写这个约定。我想做这样的事情:

[ControllerName("Bar")]
public class SomeArbitraryName : Controller {
}

或者像这样:

public class SomeArbitraryName : Controller("Bar") {
}

这有可能吗?

编辑:不,链接的“重复”问题不适用于 ASP.NET Core!

【问题讨论】:

  • Startup类中使用路由。
  • 您可以随意命名您的控制器类型。假设您注册了默认路由,/SomeArbitraryName 可以正常工作(并且您的RouteData 中的controller 令牌将是“SomeArbitraryName”)。
  • 这就是路由前缀的用途
  • @haim770 不,我不想要“SomeArbitraryName”,我想要“Bar”。

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc


【解决方案1】:

您可以实现自己的System.Web.Mvc.IControllerFactory 并在应用程序初始化步骤中的某个时间点执行ControllerBuilder.Current.SetControllerFactory(new MyImpl())

编辑:此建议适用于 ASP.NET MVC 5,Core 可能对类似的东西有不同的接口

【讨论】:

  • OP 正在询问 Asp.Net Core。此外,ControllerBuilder 负责构建已知控制器(在完成路由之后)。这不是这里需要的。
  • @haim770 看来你是对的。我想我需要玩一下 Core :)
【解决方案2】:

属性路由在 Asp.Net Core 中仍然存在

[Route("Bar")]
public class SomeArbitraryName : Controller
{
    // ...
}

Documentation: Routing to Controller Actions - Attribute Routing

【讨论】:

  • 感谢 @haim770 在您为我添加链接时添加了链接。
  • 这里的问题是,如果我有一个动作 [Route("Bar/edit")]public void IActionResult edit(int id) 那么它不会正确路由...实际上它会路由到 Bar 而不是 Bar/edit...
  • 要么覆盖动作路由[Route("/Bar/edit")],要么从动作路由中移除bar,以便它继承控制器的前缀。
猜你喜欢
  • 2017-07-10
  • 2020-09-06
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多