请求 URL "HelloWorld" 如何在 ASP.Net MVC 中实例化 HelloWorldController 对象?

How does a request URL "HelloWorld" instantiate a HelloWorldController object in ASP.Net MVC?

我发现 this documentation 非常混乱。

创建文件后

using System.Web;
using System.Web.Mvc; 

namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 

        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 

        // 
        // GET: /HelloWorld/Welcome/ 

        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

在我的 ASP.NET MVC 项目的 Controllers 文件夹中,我可以向我站点的子页面 HelloWorld 发出 URL 请求,显然是 HelloWorldController 对象被创建并且它的方法 Index() 被调用。这到底是怎么发生的对我来说是个谜。该文档有 1 个句子,简单地说

The first part of the URL determines the controller class to execute. So /HelloWorld maps to the HelloWorldController class.

但我不明白这是怎么回事。 MVC 源文件中必须有其他地方接受子页面的 URL 请求并将其附加 "Controller" 并查找具有从 [=17 派生的相同名称的 class =] class。魔法在哪里发生?此外,这如何转化为运行时,因为在运行时源代码中 classes 的名称是 extinct/irrelevant?还是我对一切都一头雾水?

将来自路由系统的请求映射到控制器DefaultControllerFactory[的责任 class.

DefaultControllerFactoryconvention-over-configuration pattern 之后。工厂寻找满足以下条件的控制器 -

  • class必须是public
  • class必须具体
  • class不能带泛型参数
  • class 的名称必须以 Controller
  • 结尾
  • class必须实现IController接口

如果您想要 HelloWorld 请求映射到 HelloWorldJonDoe 控制器,您可以通过覆盖 DefaultControllerFactory.

创建 ControllerFactory

您对此并不完全困惑。路由需要对 MVC 进行一些学习。查看 App_Start/RouteConfig.cs 的项目。在此文件中,您将看到为 MVC 创建默认路由的位置。

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
}

URL 部分显示传入的 URL 的外观,默认值显示如果您未填写 URL 中的所有部分将放入的内容.这就是它将 URL 段映射到控制器的方式。它实际上将 Controller 附加到 HelloWorld 以获得正确的 class,但这就是为什么它首先知道 HelloWorld 是控制器的原因。

如果您需要有关如何使用路由的更多信息,我发现此 link 很有帮助:https://msdn.microsoft.com/en-us/library/cc668201(v=vs.140).aspx