控制器名称是从类名派生的吗?

Posted

技术标签:

【中文标题】控制器名称是从类名派生的吗?【英文标题】:Is the controller name derived from the class name? 【发布时间】:2011-10-09 15:27:38 【问题描述】:

这是一个新手问题...

我在查看默认的 asp.net mvc3 项目,发现有一个控制器叫做:

public class AccountController : Controller

我查看了整个代码,找不到指定 AccountController 映射到 URL 的 /Account/ 的位置。

我发现您可以在Global.asax 中使用routes.MapRoute(..) 更改路由,但我仍然不知道他们指定AccountController 映射到/Account/ 的位置。

如果从类名中假设,那是否意味着所有控制器类都必须命名为 xxxxxController?

【问题讨论】:

【参考方案1】:

是的,除非您实现自己的控制器工厂。

【讨论】:

【参考方案2】:

是的,你是对的,所有控制器都需要遵循结尾 "Controller" 的命名约定。

查看 CodePlex 上 ASP.NET MVC 代码中的 ControllerName 属性:

public virtual string ControllerName 
    get 
        string typeName = ControllerType.Name;
        if (typeName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
        
            return typeName.Substring(0, typeName.Length - "Controller".Length);
        
        return typeName;
    

无论如何,您可以使用自己的控制器工厂来更改命名约定。

希望对您有所帮助。

【讨论】:

【参考方案3】:

是的,这是称为 CoC 的 MVC 框架的一个关键方面,Convention over Configuration。这个想法是,只要你愿意遵循类名、方法名、文件夹结构等的默认约定,你就可以最大限度地减少工作所需的工作量。只有当你想偏离这些约定时,你才会付出努力,你当然可以做到。

MVC 框架中有许多这样的项目。除了所有控制器都是名为 XxxxController 的类的约定外,还有一个约定是所有视图都位于名为 View\Xxxx\Yyyyy.cshtml 的文件夹中。

【讨论】:

以上是关于控制器名称是从类名派生的吗?的主要内容,如果未能解决你的问题,请参考以下文章

将属性名称更改为在使用Json.net进行序列化时已实例化的派生类名称

c++之继承与派生

获取视图控制器的类名称作为字符串NSStringFromClass

单片机里的程序是从main函数开始执行的吗?请高手进。

面向对象 继承 派生

SpringMVC