Asp.net core mvc 如何在核心mvc中发现控制器而不添加;控制员;后缀

Asp.net core mvc 如何在核心mvc中发现控制器而不添加;控制员;后缀,asp.net-core-mvc,Asp.net Core Mvc,我的理解是,如果核心mvc(was mvc 6)控制器以“Controller”结尾,或者它们派生自Controller类,则可以发现它们。网络上至少有一个地方说明了这一点 但是在我对一个非常基本的MVC6RC1网站的测试中,只有当它有一个“controller”后缀时,才会发现控制器。我错过什么了吗?例如,框架发现了以下控制器: public class HomeController : Controller { // GET: /<controller>/ pub

我的理解是,如果核心mvc(was mvc 6)控制器以“Controller”结尾,或者它们派生自
Controller
类,则可以发现它们。网络上至少有一个地方说明了这一点

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

public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return View();
    }
}
公共类HomeController:控制器
{
//获取://
公共IActionResult索引()
{
返回视图();
}
}
但该控制器不是:

public class Home: Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        return View();
    }
}
公共类主页:控制器
{
//获取://
公共IActionResult索引()
{
返回视图();
}
}

这就是我们想要的行为吗?是否可以更改它,以便从
Controller
派生的类可以在没有“Controller”后缀的情况下被发现?

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

如果实际上控制器名为
Home
,如我的示例中所列,并且它继承自
controller
,则框架将其视为
控制器
,并在路由需要名为
Home
的控制器时找到

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


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

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

如果实际上控制器名为
Home
,如我的示例中所列,并且它继承自
controller
,则框架将其视为
控制器
,并在路由需要名为
Home
的控制器时找到

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


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

我不确定是否有一种内置的方法可以做到这一点,但如果没有,您总是可以从
DefaultControllerFactory
继承并重写
GetControllerType
,以任意方式解析控制器@BradleyUffner谢谢,我已经尝试采纳你的建议,但我看不到
DefaultControllerFactory
GetControlerType
方法。我正在看这里的源代码:我找错地方了吗?啊,我错过了这是.net核心。我在这方面没有太多经验,有些东西看起来与以前的版本略有不同。快速浏览一下您链接的代码,我觉得它仍然可以工作,但会覆盖
CreateController
。或者可能会弄乱传递到工厂的
IControllerActivator
实现。我不确定是否有内置的方法来实现这一点,但您可以始终从
DefaultControllerFactory
继承并重写
GetControllerType
,以便在没有内置方法的情况下以任何方式解析控制器@BradleyUffner谢谢,我已经尝试采纳你的建议,但我看不到
DefaultControllerFactory
GetControlerType
方法。我正在看这里的源代码:我找错地方了吗?啊,我错过了这是.net核心。我在这方面没有太多经验,有些东西看起来与以前的版本略有不同。快速浏览一下您链接的代码,我觉得它仍然可以工作,但会覆盖
CreateController
。或者可能会弄乱传递到工厂的
IControllerActivator
实现。