忘记在派生类中为Controller添加后缀-为什么编译器不抱怨

本文关键字:为什么 编译器 后缀 添加 派生 Controller 忘记 | 更新日期: 2023-09-27 17:59:30

当我今天读到这个问题并在过去犯了同样的错误时,我想知道是否需要(由于默认约定?)在ASP.NET MVC中从Controller类派生的类名后面加上"Controller"后缀,为什么compiler一点也不抱怨?至少一个警告可以节省一些人的时间。

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

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

所以我的问题是:

  1. 我们可以更改这个约定吗?也就是说,我可以在某个地方更改设置,并改为后缀文本"MvcController"吗
  2. 更重要的是,C#编译器没有抱怨的原因是什么?它搞不清楚,还是不可取/不合逻辑

这个问题和答案并不能同时回答我的两个问题,所以我认为它不是完全重复的。

忘记在派生类中为Controller添加后缀-为什么编译器不抱怨

您链接到的问题指出了为什么"Controller"后缀是默认约定,如为什么MVC控制器必须具有尾部';控制器';关于他们类名的约定?:

想象一下,有一个ProductController可能处理产品应用程序模型实体实例。如果没有控制器命名约定,我们将有两个具有相同名称的类型,因此必须始终提供名称空间来区分这两个类型。

回答您的问题:

我们可以更改这个约定吗?也就是说,我可以在某个地方更改设置,并改为后缀文本"MvcController"吗?

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

C#编译器没有抱怨的原因是什么?它搞不清楚,还是不可取/不合逻辑?

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

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

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

除非您使用MVC 6,否则您需要将控制器命名为

 public class NameController:Controller{}

控制器必须

  • 成为公众阶层
  • 从控制器或从继承自控制器类的基类继承
  • 不是抽象类
  • 不是子类
  • 以"控制器"结尾的单词命名