2015-05-06 42 views
3

我發現this documentation很混亂。請求URL「HelloWorld」如何在ASP.Net MVC中實例化HelloWorldController對象?

在我的ASP.NET MVC項目的Controllers文件夾創建一個文件

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..."; 
     } 
    } 
} 

後,我可以做一個URL請求到我的網站的子頁面HelloWorld,顯然實例的HelloWorldController對象創建並調用其方法Index()。究竟發生了什麼對我來說是個謎。該文檔有一句簡單的說:

URL的第一部分決定了要執行的控制器類。 So/HelloWorld映射到HelloWorldController類。

但我不明白這是怎麼發生的。 MVC源文件中必須有其他位置,它會爲子頁面請求一個URL請求,並將其附加到「Controller」中,並尋找與Controller類相同名稱的類。那種魔法在哪裏發生?另外,如何將其轉換爲運行時,因爲在運行時,源代碼中類的名稱已經滅絕/不相關?還是我完全糊塗了一切?

+0

它的命名慣例,可以覆蓋所有這一切,但在asp.net.mvc很多邏輯通過默認它是通過命名約定完成的。因此,由於您正在請求一個名爲「HelloWorld」的頁面,因此它將查找HelloWorldController來實例化。 – Dzyann

+0

你幾乎可以解釋你的問題中的高層次過程​​。我不確定要查找哪些特定的源文件來查找代碼,但如果您真的想要,我相信您可以找到它。顯然類名在運行時仍然是已知的,請考慮堆棧跟蹤。該信息包含在二進制文件中。 – evanmcdonnal

+0

很久以前,當我開始使用MVC時,我發現Scott Hanselman的這段視頻非常清楚=> http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-Basics-Introduction-by-Scott- Hanselman – Dzyann

回答

3

映射從路由系統請求以控制器DefaultControllerFactory類的責任。

DefaultControllerFactory跟在convention-over-configuration pattern之後。工廠尋找控制器符合下列性判據 -

  • 類必須是公共
  • 類必須是具體的
  • 類絕不能採取泛型參數
  • 類的名稱必須結束與控制器
  • 的類必須實現一個IController接口

如果你想重新HelloWorld探索地圖HelloWorldJonDoe控制器,您可以通過覆蓋DefaultControllerFactory創建ControllerFactory

2

你對此不完全困惑。路由需要一些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以獲得適當的類,但這就是爲什麼它知道HelloWorld是首位的控制器。

我發現這個鏈接有用的,如果您需要關於如何使用路由工作的詳細信息:https://msdn.microsoft.com/en-us/library/cc668201(v=vs.140).aspx

+1

路由系統只是從URL中提取值並將它們沿請求管道傳遞。它不知道控制器和操作。相反,控制器工廠負責處理傳入請求並將其映射到特定控制器。我同意這個問題含糊不清。 – Win

+0

的確,我的意思並不是暗示這些路由通過了控制器類,只是路由定義了什麼將用於映射工廠所需的數據。 –

相關問題