在派生类中忘记后缀Controller - 为什么编译器不投诉

时间:2015-06-25 08:26:01

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

今天在阅读此question并在我自己身上犯同样的错误时,我想知道是否需要(由于默认约定?)我们必须将“Controller”后缀为从{{1 ASP.NET MVC中的类,为什么compliler根本不抱怨?至少一个警告可以节省一些人的时间。

所以下面的代码不起作用:

Controller

所以我的问题是:

  1. 我们可以更改此约定,即我可以在某处更改设置并改为使用后缀文本'MvcController'吗?
  2. 更重要一点,C#编译器不抱怨的原因是什么?它无法弄清楚它是不是想要/不合逻辑?
  3. question并且答案没有回答我的问题,所以我认为这不完全重复。

2 个答案:

答案 0 :(得分:5)

您链接的问题指出了“Controller”后缀正是默认约定的原因,如Why do MVC controllers have to have the trailing 'Controller' convention on their class name?中所述:

  

想象一下,有一个可能处理Product应用程序模型实体实例的ProductController。由于没有控制器命名约定,我们有两个具有相同名称的类型因此总是必须提供名称空间来区分这两者。

回答你的问题:

  

我们可以更改此约定,即我可以在某处更改设置并改为使用后缀文本'MvcController'吗?

是的,通过构建自己的IControllerFactory。请参阅Adding a controller factory to ASP MVC

  

C#编译器不抱怨的原因是什么?它无法弄清楚它是不是想要/不合逻辑?

命名约定只是一个MVC构造。 MVC是一个在.NET之上运行的框架,没有什么特别之处。

编译器无法弄清楚这一点,因为没有简单的方法来公开需要在编译时检查的运行时需求,例如“如果类继承自System.Web.Mvc.Controller或{{ 1}},它的名称必须以'Controller'结尾,除非注册了非默认的ControllerFactory,在这种情况下,使用该工厂的约定,无论它们是什么“

MVC依赖于反射来在运行时检查类型(及其名称)。 C#编译器在编译时工作。

答案 1 :(得分:0)

除非您在MVC 6下,否则您需要按如下方式命名您的控制器

 public class NameController:Controller{}

控制器必须

  • 是公共课
  • 继承自控制器或继承自控制器类
  • 的基类
  • 不是抽象类
  • 不是子类
  • 以" Controller"
  • 结尾的单词命名