轉載於:http://www.cnblogs.com/bennettwang00/p/MVC5Controller.html
MVC是Model-View-Controller的簡寫。MVC是一種開發良好架構,可測試,易維護應用程序的設計模式。據於MVC的應用程序應該包含:
Models: 是呈現應用程序數據和使用驗證邏輯給指定的數據強制執行業務規則的Class類。
Views: 是你的應用程序用來動態產生HTML響應的模板文件。
Controllers: 是用來處理傳入瀏覽器的請求,從Model里面取數據,然后指定返回瀏覽器響應的視圖模板的Class類。
在本教程中我們將覆蓋這些所有的概念,並且向你顯示如何使用他們。
1. 創建Controller
讓我們開始創建一個Controller類。在Solution Explorer下,右擊Controllers文件夾然后點擊Add,最后選擇Controller。
在彈出的Add Scaffold對話框中,點擊MVC 5 Controller - Empty, 然后點擊Add。
給你的新的Controller命名為“HelloWorldController”,然后點擊Add。
注意:
在Solution Explorer下一個叫HelloWorldController.cs和一個新的文件夾Views/HelloWorld被創建了。在IDE中這個controller默認被打開。
用下面的代碼替換這個文件中內容:
1 using System.Web; 2 using System.Web.Mvc; 3 4 namespace MvcMovie.Controllers 5 { 6 public class HelloWorldController : Controller 7 { 8 // 9 // GET: /HelloWorld/Index 10 public string Index() 11 { 12 return "This is my <b>Default</b> action method..."; 13 } 14 15 // 16 // GET: /HelloWorld/Welcome 17 public string Welcome() 18 { 19 return "This is the Welcome action method..."; 20 } 21 } 22 }
這個controller方法將返回一個HTML字符串作為一個例子。這個controller被命名為HelloWorldController和這第一個方法命名為Index. 接下來讓我們從瀏覽器調用這個方法。運行這個應用程序,在這個瀏覽器上的地址欄中添加“HelloWorld”路徑(例如:http://localhost:5000/HelloWorld). 在瀏覽器中的頁面將顯示如下。在上面的方法中,代碼直接返回了一個字符串。你告訴系統僅僅返回一些HTML,而且這個系統也如我們所願!
2. 路由配置
ASP.NET MVC根據傳入的URL調用不同的controller類(其中包含不同的action方法)。ASP.NET MVC通過使用默認的URL路由規則來決定什么代碼將被調用,讓我們來看一下這個默認的下路由配置:
/[Controller]/[ActionName]/[Parameters]
你可以在App_Start/RouteConfig.cs文件中設置這個路由規則。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9 ); 10 }
當你沒有提供任何URL段來運行應用程序時,這個應用程序默認使用“Home” controller及其中的“Index” action方法作為默認的URL(如上代碼所示) 。
這個URL的第一部分決定了controller類的執行,因此/HelloWorld與HelloWorldController類匹配。URL第二部分決定了這個controller類中action方法的執行,因此/HelloWorld/Index將導致HelloWorldController中的Index方法執行。注意:我們僅在瀏覽器地址欄中給出了/HelloWorld,而Index方法是默認使用的。這是因為如果一個controller沒有指定其所調用的action方法,那么其會默認調用命名為Index的action方法。URL的第三部分是給路由數據用的。在這個教程中我們將看到這些路由數據。
瀏覽http://localhost:xxxx/HelloWorld/Welcome。這個Welcome方法將返回字符串“This is the Welcome action method...”。這個默認的MVC匹配的路由是/[Controller]/[ActionName]/[Parameters]。對於這個URL,它的controller是HelloWorld,action方法是Welcome,並且你還沒有使用[Parameters]部分。
為了我們能夠傳遞參數信息給這個URL,讓我們輕微的修改這個例子(例如:/HelloWorld/Welcome?name=zhonghua&numtimes=5).修改你的Welcome方法以便能包含上面的2個參數。注意:這個代碼用了C#的可選功能來定義numTimes參數,如果沒有值傳入,其默認的值為1。
1 public string Welcome(string name, int numTimes = 1) 2 { 3 return HttpUtility.HtmlEncode("Hello " + name + ", NumTiems is " + numTimes); 4 }
安全提示:上面的代碼用了HttpServerUtility.HtmlEncode來保護這個應用程序,避免用戶的非法輸入。想了解更多信息,請查看 How to: Protect Against Script Exploits in a Web Application by Applying HTML Encoding to Strings
運行你的應用程序,瀏覽到這個示例的URL地址(http://loaclhost:xxxx/HelloWorld/Welocme?name=zhonghua&numtimes=5).你也可以在URL的name和numTimes嘗試不同的值。這個ASP.NET MVC模型綁定系統將會從地址欄中的query String到你方法中的參數自動的匹配命名的參數。
在上面的例子中,URL參數部分還是沒有被使用到,這個name和numTimes參數是作為query strings被傳入的。URL中的“?”相當於一個分割線,后面跟着的是查詢字符串,不同的參數之間用“&”字串連接。
用下面的代碼替換Welcome中的方法:
1 public string Welcome(string name, int ID = 1) 2 { 3 return HttpUtility.HtmlEncode("Hello " + name + ", ID is " + ID); 4 }
運行這個應用程序,然后鍵入URL地址:http://localhost:xxxx/HelloWorld/Welcome/3?name=zhonghua
這次URL匹配了路由參數ID.這個Welcome方法包含了一個與登記路由方法中定義的URL相匹配的ID。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9 ); 10 }
在ASP.NET MVC應用程序中,通過路由數據傳入參數比通過查詢字符串(query strings)來傳入參數是更加普遍的。你也可以在URL的路由數據中添加name和numtimes參數。如在App_Start\RouteConfig.cs文件中,添加“Hello”路由:
1 routes.MapRoute( 2 name:"Hello", 3 url:"{controller}/{action}/{name}/{id}" 4 );
運行這個應用程序,並鍵入地址: /localhost:xxxx/HelloWorld/Welcome/zhonghua/3
對於大多數MVC應用程序而言,默認的路由使用起來也比較方便。在稍后的章節了我們將學習通過模型綁定來傳染數據,到時候你將不得不修改默認的路由配置。
在這些例子中這個controller已經作了MVC中的“VC”部分 -- 也就是View和Controller可以起作用了。這個controller直接返回HTML。通常情況下,你並不想controller直接返回HTML,因為這將使得代碼和粗糙。取而代之的是我們用視圖文件來產生HTML響應。接下來讓我們看看如何使用這個視圖文件吧。