请求 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.
DefaultControllerFactory
在 convention-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
我发现 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.
DefaultControllerFactory
在 convention-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