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

SBi*_*are 3 c# asp.net asp.net-mvc

在今天阅读这个问题并在过去自己犯同样的错误时,我想知道是否需要(由于默认约定?)我们必须将"Controller"后缀为从ControllerASP.NET MVC中的类派生的类名,为什么compliler会根本不抱怨?至少一个警告可以节省一些人的时间.

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

public class Search : Controller
{
    // GET: /Search/
    public ActionResult List()
    {
        var model = new MyModel();
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 我们可以更改此约定,即我可以更改某处设置并改为后缀文本'MvcController'吗?
  2. 更重要的一点,C#编译器不抱怨的原因是什么?它无法弄清楚它是不是想要/不合逻辑?

问题和答案,所以我认为这是不准确的复制不回答我的两个问题.

Cod*_*ter 5

您链接的问题指出了为什么"Controller"后缀是默认约定,如为什么MVC控制器必须在其类名上具有尾随的"Controller"约定?:

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

回答你的问题:

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

是的,通过构建自己的IControllerFactory.请参阅将控制器工厂添加到ASP MVC.

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

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

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

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