ASP.NET MVC是如何啟動並執行[1]: 建立在“偽”MVC架構上的Web應用

來源:互聯網
上載者:User

ASP.NET由於採用了管道式設計,具有很好的擴充性,而整個ASP.NET MVC應用程式框架就是通過擴充ASP.NET實現的。通過上面對ASP.NET管道設計的介紹,我們知道ASP.NET的擴充點只要體現在HttpMoudle和HttpHandler這兩個核心組建之上,實際上整個ASP.NET MVC架構就是通過自訂的HttpMoudle(UrlRoutingModule)和HttpHandler(MvcHandler)實現的。為了上讀者從整體上把握ASP.NET MVC的工作機制,接下來我按照其原理通過一些自訂群組件來類比ASP.NET MVC的運行原理,我們也可以將此視為一個“迷你版”的ASP.NET MVC。值得一提的是,為了讓讀者根據該執行個體從真正的ASP.NET MVC中找到對應的組件,我完全採用了與ASP.NET MVC一致的類型命名方式。

在正式介紹我們自己建立 的“迷你版”ASP.NET MVC的實現原理之前,我們不妨來看看建立在該架構之上的Web應用如何?。我們通過Visual Studio建立一個空的ASP.NET Web應用(注意不是ASP.NET MVC應用),我們不會引用System.Web.Mvc.dll這個程式集,所以你在接下來的程式中看到的定義在該程式集中的同名類型都是我們自行定義的。

我們首先定義了如下一個SimpleModel類型,它表示最終需要綁定到View上的資料。簡單起見,同時也為了驗證針對Controller和Action的解析機制,SimpleModel定義的兩個屬性分別表示當前請求的目標Controller和Action。

   1: public class SimpleModel
2: {
3: public string Controller { get; set; }
4: public string Action { get; set; }
5: }

像真正的ASP .NET MVC應用開發一樣,我們需要定義Controller類型。如下面的代碼片斷所示,按照我們熟悉的命名方式(以字元Controller作為尾碼),我們定義了如下一個HomeController。HomeController實現的抽象類別型ControllerBase是我們自行定義的。以自訂的ActionResult作為傳回型別的Index方法表示Controller的Action,它接受一個SimpleModel類型的對象作為參數。該Action方法返回的ActionResult是一個RawContentResult對象,顧名思義,RawContentResult就是將指定的內容進行原樣顯示。在這裡我們將作為參數的SimpleModel對象的Controller和Action屬性顯示出來。

   1: public class HomeController: ControllerBase
2: {
3: public ActionResult Index(SimpleModel model)
4: {
5: string content = string.Format("Controller: {0}<br/>Action:{1}", model.Controller, model.Action);
6: return new RawContentResult(content);
7: }
8: }

ASP.NET MVC根據請求地址來解析出用於處理該請求的Controller的類型和Action方法名稱。具體來說,我們預註冊一些包含Controller和Action名稱作為站位符的(相對)地址模板,如果請求地址符合相應地址模板的模式,Controller和Action名稱就可以正確地解析出來。和ASP.NET MVC應用類似,我們在Global.asax中註冊了如下一個地址模板({controller}/{action})。

   1: public class Global : System.Web.HttpApplication
2: {
3: protected void Application_Start(object sender, EventArgs e)
4: {
5: RouteTable.Routes.Add("default",new Route{Url = "{controller}/{action}"});
6: ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
7: ControllerBuilder.Current.DefaultNamespaces.Add("WebApp");
8: }
9: }

在如上所示的用於進行地址模板註冊的Application_Start方法之中,我們還註冊了一個用於建立Controller對象的工廠。前面定義的HomeController定義在命名空間WebApp下,由於請求地址中只能解析出Controller類型的名稱,我們需要將該命名空間註冊為當前ControllerBuilder的預設命名空間。RouteTable、ControllerBuilder和DefaultControllerFactory都是我們自訂的類型。

正如我上面所說,ASP.NET MVC是通過一個自訂的HttpModule實現的,在這個“迷你版”ASP.NET MVC架構中我們也將其起名為UrlRoutingModule。在運行Web應用之前,我們需要通過配置對該自訂HttpModule進行註冊,下面是相關的配置。

   1: <configuration>
2: <system.webServer>
3: <modules>
4: <add name="UrlRoutingModule"
5: type="Artech.MiniMvc.UrlRoutingModule, Artech.MiniMvc"/>
6: </modules>
7: </system.webServer>
8: </configuration>

到目前為止,所有的編程和配置工作已經完成。為了 讓定義在HomeController中的Action方法Index來處理針對該Web應用的訪問請求,我們需要指定與之匹配的地址(符合定義在登入位址模板的URL模式)。如下圖所示,由於在瀏覽器中輸入地址(http://.../Home/Index)正好對應著HomeController的Index操作,所以對應的方法會被執行,而執行的結果就是將當前請求的目標Contrller和Action的名稱顯示出來。

上面我們我們示範了如何在我們自己建立的“迷你版”ASP.NET MVC架構中建立一個Web應用,從中我們可以看到和建立一個真正的ASP.NET MVC應用別無二致。接下來我們就來逐步地分析這個自訂的ASP.NET MVC架構是如何建立起來的,而它也代表了真正的ASP.NET MVC架構的工作原理。

配套源碼: http://www.bianceng.net/dotnet/201210/533.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.