2016-04-21 34 views
1

我的理解是,如果核心mvc(是MVC 6)控制器以“控制器”结尾,则它们可以从Controller类派生。至少有一个地方在网络上声明这是http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/如何在不添加“控制器”后缀的情况下使控制器在核心mvc中可发现?

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

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

但这控制器不是:

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

那是预期的行为?是否可以更改它,以便从Controller派生的类可以在没有“控制器”后缀的情况下被发现?

+1

我不确定是否有内置的方式来做到这一点,但是您可以始终从'DefaultControllerFactory'继承并覆盖'GetControllerType'来以任何您想要的方式解析您的控制器(如果没有的话)。 http://www.codeproject.com/Tips/732449/Understanding-and-Extending-Controller-Factory-i –

+0

@BradleyUffner谢谢,我试着去追求你的建议,但我看不到'DefaultControllerFactory'有一个'GetControlerType'方法。我在这里查看源代码:https://github.com/aspnet/Mvc/blob/release/src/Microsoft.AspNetCore.Mvc.Core/Controllers/DefaultControllerFactory.cs我在错误的地方看? –

+0

啊,我错过了这是.net核心。我没有太多的经验,有些事情看起来像从以前的版本略有改变。快速浏览一下你链接的代码使我认为它仍然可以工作,但是重写'CreateController'。或者可能会混淆传入工厂的'IControllerActivator'实现。 –

回答

0

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

事实上,如果控制器名为Home,因为在我的例子上市,它继承Controller将被视为一个Controller由框架,当路由需要一个叫做Home控制器会被发现。

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

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

相关问题