【问题标题】:How to make controller discoverable in core mvc without adding "Controller" suffix?如何在不添加“控制器”后缀的情况下使控制器在核心 mvc 中可发现?
【发布时间】:2016-08-14 22:50:51
【问题描述】:

我的理解是,如果核心 mvc(原为 MVC 6)控制器以“Controller”结尾它们派生自 Controller 类,则可以发现它们。网络上至少有一个地方表明这是http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/

但是在我对一个非常基本的 MVC 6 RC1 网站的测试中,只有当它具有“Controller”后缀时才会发现控制器。我错过了什么吗?例如,框架发现了以下控制器:

public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return View();
    }
}

但是这个控制器不是:

public class Home: Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return View();
    }
}

这是预期的行为吗?是否可以更改它以使派生自 Controller 的类在没有“Controller”后缀的情况下也可被发现?

【问题讨论】:

  • 我不确定是否有内置方法可以做到这一点,但您始终可以从 DefaultControllerFactory 继承并覆盖 GetControllerType 以任何您想要的方式解析您的控制器(如果有)吨。 codeproject.com/Tips/732449/…
  • @BradleyUffner 谢谢,我已尝试采纳您的建议,但我看不到 DefaultControllerFactoryGetControlerType 方法。我在看这里的源代码:github.com/aspnet/Mvc/blob/release/src/…我是不是找错地方了?
  • 啊,我错过了这是 .net 核心。我对此没有太多经验,有些东西看起来与以前的版本略有不同。快速浏览您链接的代码让我认为它仍然可以工作,但会覆盖CreateController。或者可能会弄乱传入工厂的IControllerActivator 实现。

标签: asp.net-core-mvc


【解决方案1】:

经过进一步研究,我意识到我错了。或者更确切地说,我误解了我所看到的。

如果实际上控制器被命名为Home,如我的示例中所列,并且它继承自Controller,那么框架将认为它是Controller,并且当路由需要名为@ 的控制器时会被找到987654324@。

在我的情况下,我实际上想将我的控制器命名为 HomeCtlr 而不是 HomeController,但这不起作用,但不是因为框架没有将其识别为控制器。真正的问题是它匹配的路由需要一个名为HomeCtlr 的控制器,而不是一个名为Home 的控制器。所以最后我意识到我想错了,问错了问题。

所以我提出的问题的实际答案是,任何从Controller 类继承的类都将被框架视为控制器。不需要“控制器”后缀。但是请注意,您不能添加其他一些缩写后缀,因为在将路由匹配到该控制器时,它将被视为控制器名称的一部分(这当然很有意义!)呵呵!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 2014-05-11
    • 1970-01-01
    • 2020-10-03
    • 2015-10-28
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多