2016-04-21 31 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類的類都將被框架視爲控制器。不需要「控制器」後綴。但是要注意,你不能添加一些其他縮寫後綴,因爲當匹配到該控制器的路由時,它將被視爲控制器名稱的一部分(這當然非常合理!)杜!

相關問題