控制器本質(zhì)上是ASP.NET MVC應(yīng)用程序的中心單元。 它是第一個請求接收者,與傳入的HTTP請求進行交互。 因此,控制器決定選擇哪個模型,然后從模型中獲取數(shù)據(jù),并將其傳遞給相應(yīng)的視圖,然后渲染視圖。 實際上,控制器正在控制應(yīng)用程序的整體流程,并輸出正確的輸出。
控制器是繼承自System.Web.Mvc.Controller
的 C# 類,它是內(nèi)置的控制器基類。 控制器中的每個公共方法都稱為一個操作方法,這意味著您可以通過某個URL從Web調(diào)用它來執(zhí)行操作。
MVC約定是將控制器放置在Visual Studio 在項目設(shè)置時創(chuàng)建的文件夾(Controllers)中。
我們來看一個簡單的控制器例子,通過創(chuàng)建一個新的ASP.Net MVC項目。
第1步 - 打開Visual Studio,然后單擊菜單:文件 -> 新建 -> 項目 選項。一個新的項目對話框打開。
第2步 - 在左側(cè)窗格中,選擇模板:Visual C# -> Web 。
第3步 - 在中間窗格中,選擇“ASP.NET Web應(yīng)用程序” 。如下圖所示 -
第4步 - 在名稱字段中輸入項目名稱:MVCControllerDemo,然后單擊確定 繼續(xù)。 您將看到以下對話框,要求為ASP.NET項目設(shè)置初始內(nèi)容。
第5步 - 為了簡單起見,選擇空 選項,并在“為以下項添加文件夾和核心引用”部分選中MVC復(fù)選框,然后單擊【確定】。
它將使用最少的預(yù)定義內(nèi)容創(chuàng)建一個基本的MVC項目。
當(dāng)Visual Studio項目創(chuàng)建以后,在“解決方案資源管理器” 窗口中看到許多文件和文件夾。
由于這里從一個空的項目模板中創(chuàng)建了ASP.Net MVC項目,因此目前應(yīng)用程序不包含任何要運行的東西。
第6步 - 通過在解決方案資源管理器 中右鍵單擊 Controllers
文件夾來添加一個:EmployeeController
。選擇:添加 -> 控制器 。如下所示 -
它將顯示“添加基架” 對話框。如下所示 -
第7步 - 選擇MVC 5控制器 - 空 選項,然后單擊“添加” 按鈕。添加控制器對話框?qū)⒊霈F(xiàn)。
第8步 - 將名稱設(shè)置為:EmployeeController ,然后單擊“添加” 按鈕。如下所示 -
在Controllers 文件夾中看到一個新的 C# 文件 - EmployeeController.cs
,在Visual Studio中打開并進行編輯。默認(rèn)代碼如下所示 -
現(xiàn)在,在這個應(yīng)用程序中,我們將使用默認(rèn)路由為EmployeeController
控制器,這需要添加一個自定義的路由。請參考以下步驟實現(xiàn) -
第1步 - 轉(zhuǎn)到“App_Start”文件夾下的 RouteConfig.cs 文件,并添加以下路由。
routes.MapRoute(
"Employee", "Employee/{name}", new{
controller = "Employee", action = "Search", name =
UrlParameter.Optional });
以下是RouteConfig.cs 文件的完整實現(xiàn)。參考以下代碼 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCControllerDemo {
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes){
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Employee", "Employee/{name}", new{
controller = "Employee", action = "Search", name = UrlParameter.Optional });
routes.MapRoute(
name: "Default", url: "{controller}/{action}/{id}", defaults: new{
controller = "Home", action = "Index", id = UrlParameter.Optional });
}
}
}
考慮一個場景,其中任何用戶來到并搜索雇員,指定URL為Employee/Maxsu
。 在這種情況下,Maxsu
將被視為參數(shù)名稱,而不是操作的方法。所以在這種情況下,默認(rèn)路由將不會工作顯示。
當(dāng)參數(shù)傳遞時,要從瀏覽器獲取傳入值,MVC框架提供了一個簡單的方法來解決這個問題。它是通過使用操作方法內(nèi)部的參數(shù)。
第2步 - 使用以下代碼更改EmployeeController
類。參考以下代碼 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCControllerDemo.Controllers
{
public class EmployeeController : Controller
{
// GET: Employee
public ActionResult Search(string name)
{
var input = Server.HtmlEncode(name);
return Content(input);
}
}
}
如果將一個參數(shù)添加到操作方法中,則MVC框架將查找與參數(shù)名稱匹配的值。它將應(yīng)用所有可能的組合來找出參數(shù)值。它將搜索路由數(shù)據(jù),查詢字符串等
因此,如果請求:/Employee/Maxsu
,那么MVC框架將決定需要一個帶有UserInput
的參數(shù),然后Maxsu
會從URL中挑選出來并自動傳遞。
Server.HtmlEncode
將簡單地轉(zhuǎn)換任何形式的純文本惡意腳本。當(dāng)上面的代碼被編譯并執(zhí)行并請求以下URL:http://localhost:51066/Employee/Maxsu
時,將得到以下輸出。參考下圖所示 -
正如你在上面的屏幕截圖中看到的,Maxsu
是從URL中選取的。