ASP.NET MVC操作方法負責執行請求並生成回應。默認情況下,它以ActionResult
的形式生成回應。操作通常具有與用戶交互的一對一映射。
例如,在流覽器中輸入一個URL,點擊任何特定的鏈接,提交表單等。這些用戶交互中的每一個都會導致請求被發送到伺服器。 在每種情況下,請求的URL都包含MVC框架用來調用操作方法的資訊。動作方法的一個限制是它們必須是實例方法,所以它們不能是靜態方法。也沒有返回值的限制。 所以可以返回字串,整數等。
請求處理
動作是MVC應用程式中的最終請求目標,它使用控制器基類。我們來看看請求處理。
當URL到達時,如
/Home/index
,這是一個UrlRoutingModule
,它檢查並理解路由表中配置的內容並知道如何處理該URL。UrlRoutingModule
將在路由表中配置的資訊放在一起,並將控制交給MVC路由處理程式。- MVC路由處理程式將控制器傳遞給作為HTTP處理程式的
MvcHandler
。 MvcHandler
使用一個控制器工廠實例化控制器,它知道實例化哪個控制器,因為它在該控制器值的RouteData
中查找。- 當
MvcHandler
有一個控制器,MvcHandler
唯一知道的就是IController
介面,所以它只是告訴控制器執行。 - 當它告訴控制器執行時,這是從MVC的控制器基類派生的。
Execute
方法創建一個動作調用者,並告訴動作調用者去找到一個方法來調用,找到一個調用的動作。 - 動作調用者再次在
RouteData
中查找並找到從路由引擎傳遞的動作參數。
動作類型
動作基本上返回不同類型的動作結果。ActionResult
類是所有操作結果的基礎。 以下是不同種類的行為結果及其行為的列表。
編號 | 名稱 | 行為 |
---|---|---|
1 | ContentResult |
返回一個字串 |
2 | FileContentResult |
返回檔內容 |
3 | FilePathResult |
返回檔內容 |
4 | FileStreamResult |
返回檔內容 |
5 | EmptyResult |
什麼都不返回 |
6 | JavaScriptResult |
返回腳本執行 |
7 | JsonResult |
返回JSON格式的數據 |
8 | RedirectToResult |
重定向到指定的網址 |
9 | HttpUnauthorizedResult |
返回403 HTTP狀態碼 |
10 | RedirectToRouteResult |
重定向到不同的動作/不同的控制器動作 |
11 | ViewResult |
作為視圖引擎的回應收到 |
12 | PartialViewResult |
作為視圖引擎的回應收到 |
我們來看看前一章(ASP.Net MVC控件器的MVCControllerDemo專案)中創建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);
}
}
}
當請求以下URL:http://localhost:51066/Employee/Maxsu
時,將收到操作的輸出如下 -
添加控制器
現在,在專案上再添加另一個控制器。
第1步 - 通過在解決方案資源管理器 中右鍵單擊 Controllers
檔夾來添加一個:控制器:CustomerController
。選擇:添加 -> 控制器 。如下所示 -
它將顯示“添加基架” 對話框。如下所示 -
第2步 - 選擇MVC 5控制器 - 空 選項,然後單擊“添加” 按鈕。添加控制器對話框將出現。
第3步 - 將名稱設置為:CustomerController
,然後單擊“添加” 按鈕。
現在,已經在Controllers檔夾中看到一個新的 C# 檔“CustomerController.cs” ,在Visual Studio中打開並進行編輯,如下所示 -
同樣,再添加一個名為HomeController的控制器。 以下是HomeController.cs類的實現。參考代碼 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCControllerDemo.Controllers
{
public class HomeController : Controller
{
// GET: Home
public string Index()
{
return "This is Home MVCControllerDemo.HomeController.Index() Action.";
}
}
}
第4步 - 運行此應用程式,將收到以下輸出 -
第5步 - 在上面創建的CustomerController.cs類中添加一個方法,如以下代碼 -
public string GetAllCustomers(){
return @"<ul>
<li>Max Su</li>
<li>Mark Jasper</li>
<li>Allan Java</li>
<li>Ruby Jerry</li>
</ul>";
}
第6步 - 運行該應用程式並請求URL: http://localhost:51066/Customer/GetAllCustomers
,將看到以下輸出 -
也可以重定向到同一控制器的操作,甚至是不同的控制器。以下是一個簡單的例子,將通過使用以下代碼更改HomeController
中的代碼,從HomeController
重定向到CustomerController
。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCControllerDemo.Controllers
{
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return RedirectToAction("GetAllCustomers", "Customer");
}
}
}
上面代碼中,使用了RedirectToAction()
方法,它有兩個參數:操作名稱和控制器名稱。
當運行這個應用程式時,會看到默認路由將重定向到/Customer/GetAllCustomers