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

C# 忘记在派生类中为控制器添加后缀-为什么编译器不抱怨,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,今天读这篇文章时,我自己也犯了同样的错误,我想知道是否需要(由于默认约定?)在ASP.NET MVC中,我们必须将“Controller”后缀为从Controller类派生的类名,为什么compliler一点也不抱怨?至少一个警告可以节省一些人的时间 因此,以下代码将不起作用: public class Search : Controller { // GET: /Search/ public ActionResult List() { var model

今天读这篇文章时,我自己也犯了同样的错误,我想知道是否需要(由于默认约定?)在ASP.NET MVC中,我们必须将“Controller”后缀为从
Controller
类派生的类名,为什么compliler一点也不抱怨?至少一个警告可以节省一些人的时间

因此,以下代码将不起作用:

public class Search : Controller
{
    // GET: /Search/
    public ActionResult List()
    {
        var model = new MyModel();
        return View(model);
    }
}
因此,我的问题是:

  • 我们是否可以更改此约定,即是否可以在某个位置更改设置,并将后缀文本改为“MvcController”
  • 更重要的一点是,C#编译器不抱怨的原因是什么?它无法理解它,或者它不是理想的/不合逻辑的

  • and答案不能同时回答我的两个问题,因此我认为它不是完全重复的。

    您链接到的问题确切地指出了为什么“Controller”后缀是默认约定,如中所述:

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

    回答您的问题:

    我们是否可以更改此约定,即是否可以在某个位置更改设置,并将后缀文本改为“MvcController”

    是的,通过建立自己的IControllerFactory。看

    C#编译器不抱怨的原因是什么?它无法理解它,或者它不是理想的/不合逻辑的

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

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


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

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

     public class NameController:Controller{}
    
    控制器必须

    • 公开上课
    • 从控制器或从控制器类继承的基类继承
    • 不是抽象类
    • 不是子类
    • 以“Controller”结尾的单词命名

    编译器没有抱怨,因为它是类的有效名称。@StephenMuecke-同意,但它不是一个普通类。它是从控制器派生的,这使它不同于普通类。当然,它是一个普通类!它只是一个内置在由其他普通类组成的框架中的约定。OP asks”为什么编译器不能检测到我忘记了控制器后缀“,而不是“MVC控制器有什么要求”。是的,但他的第一个问题是“是否可以更改此约定”这就是为什么我给出了前提条件。好吧,可以更改约定(即使是在MVC 6之前),看我的答案。酷!你说得对@codecaster谢谢。你解释得很好。我的疑问很清楚。根据定义,编译器只在遵守语言语法的情况下进行检查,并且只要你的代码遵守C#规范,编译器就不会抱怨(而且决不能抱怨)。