原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/learnmvc5-addcontroller/
本人是MVC新手,將從微軟官網學習MVC並將看過的英文文檔翻譯成中文,由於本人英文水平不好,有翻譯不準確、錯誤的地方萬望指出,我看到後將會在第一時間修改。另外也希望這一系列文章能爲後來者起到引導作用。
微軟原文地址:http://www.asp.net/mvc/overview/getting-started/introduction/adding-a-controller
添加控制器
MVC是model-view-controller的簡寫,MVC模式是一中易測試,易維護的開發應用程序架構。基於MVC的應用程序包含:
l Models:代表應用程序數據以及使用數據嚴重邏輯執行業務規則的類
l Views:應用程序動態生成Html響應的模板文件
l Controllers:處理瀏覽器傳入請求,獲取Model的數據,執行視圖模板、然後將它們響應到瀏覽器的類
在這一系列的文章中我們將涵蓋這些概念,並向引導你們如何使用它們去創建一個應用程序。
下面我們將開始創建controller類,在Solution Explorer中右鍵controller文件夾然後點擊Add->Controller選項
在彈出的Add Scaffold中選擇MVC5 Controller-Empty 點擊Add
輸入新控制器的名字爲“HellowWorldController”,然後點擊添加
如果注意查看,你會發現在側邊欄SolutionExplorer中會有一個名爲HelloWorldController.cs文件和Views\HelloWorld文件夾,HelloWorld.cs文件也會在IDE中打開。
用下面代碼替換文件夾中的內容:
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..."; } } }
控制器的方法將返回一個字符創給HTML界面。控制器的名字爲HelloWorldController ,第一個方法的名字爲Index。下面我們將調用他。
運行這個應用程序(點擊F5或者Ctrl+F5)。在瀏覽器地址欄中的地址後添加“HelloWorld”。(如:http://localhost:1234/HelloWorld)瀏覽器中顯示的界面如下所示。在上面的index方法中,代碼直接返回了一個字符串。這就相當於你告訴系統直接返回這個字符串到瀏覽器。
ASP.NET調用不同的控制器類以及不同的控制器方法依賴於傳入的URL。ASP.NET使用默認的路由邏輯解析傳入的URL來決定調用哪個Controller和方法,默認路由模板如下:
/[Controller]/[ActionName]/[Parameters]
你可以在App_Start/RouteConfig.cs文件中設置路由模板
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時瀏覽器頁面會自動進入“Home”控制器,“Index”方法。這是由上面的路由模板代碼所指定的。
路由模板的第一部分決定了控制器類,所以“/HellowWorld”映射到HelloWorldController類。第二部分決定了控制器類中的Action方法,所以“/Helloworld/Index”執行HelloWorldController類中的Index方法。這裏有一點是我們只需要在URL後面加上HelloWorld,Index方法就會被默認執行,這是因爲Index方法在路由模版中被設置爲默認Action。路由模板的第三部分是路由參數,我們將在後面慢慢講解。
運行應用程序,輸入URL:http://localhost:xxxx/HelloWorld/Welcome, Welcome方法將會運行並返回字符串“This is the Welcome action method..."。默認MVC映射規則爲/[Controller]/[ActionName]/[Parameters]。 對於輸入的URL解析則的到HelloWorld控制器以及控制器下的Welcome方法當然你並沒有輸入[Parameters] 部分。
我們修改下上面的例子,讓我們可以通過URL傳遞參數到控制器,(如 /HelloWorld/Welcome?name=Scott&numtimes=4)。修改你的Welcome方法,使它包含兩個參數(如下),使用C#代碼的可選參數特性,如果沒有傳遞參數numTimes則設置numTimes的默認值爲1
public string Welcome(string name, int numTimes = 1) { return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); }
運行應用程序並輸入實例URL(http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4)。你也可以在name和numTImes參數中嘗試輸入不同的值。ASP.NET模型綁定系統自動將你URL地址中輸入的查詢字符串映射到你指定的函數的參數中。
上面的例子中我們並沒有使用路由模板中的第三個參數/[Parameters],我們用查詢字符串傳遞name和numTimes參數。上邊鏈接中”?“是一個分隔符,查詢字符串跟在”?“後面。”&“則用來分離子查詢字符。
使用下面的代碼替換Welcome方法
public string Welcome(string name, int ID = 1) { return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID); }
運行應用程序,並輸入:http://localhost:xxx/HelloWorld/Welcome/3?name=Rick
這時路由模板的第三個參數與路由中的參數ID匹配。因爲Welcom方法中包含的參數ID與RegisterRoutes 函數中路由模板的第三個參數ID匹配。
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 } ); }
在ASP.NET MVC應用程序中,經常使用查詢字符串傳遞參數值。你也可以使用路由傳遞name 和numtimes參數,在App_Start\RouteConfig.cs文件中添加“Hello”路由模板:
public class RouteConfig { 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 } ); routes.MapRoute( name: "Hello", url: "{controller}/{action}/{name}/{id}" ); } }
運行程序,並輸入:http://llocalhost:XXX/HelloWorld/Welcome/Scott/3
對大多數MVC應用程序來說,使用默認的路由模板就可以。在本文的後續中我們將講述使用“Model綁定”來傳遞從數據,所以你也不用修改默認路由。
在本文的例子中我們使用MVC中V和C,即View和Controller。Controller直接返回到HTML界面。通常你不想Controller直接返回到HTML界面,因爲這樣將代碼變得非常複雜。我們習慣於使用一個單獨的ViewTemplate文件去生成一個HTML響應。下一遍文章我們將講解如何實現它。