ASP.NET MVC操作方法負(fù)責(zé)執(zhí)行請求并生成響應(yīng)。默認(rèn)情況下,它以ActionResult
的形式生成響應(yīng)。操作通常具有與用戶交互的一對(duì)一映射。
例如,在瀏覽器中輸入一個(gè)URL,點(diǎn)擊任何特定的鏈接,提交表單等。這些用戶交互中的每一個(gè)都會(huì)導(dǎo)致請求被發(fā)送到服務(wù)器。 在每種情況下,請求的URL都包含MVC框架用來調(diào)用操作方法的信息。動(dòng)作方法的一個(gè)限制是它們必須是實(shí)例方法,所以它們不能是靜態(tài)方法。也沒有返回值的限制。 所以可以返回字符串,整數(shù)等。
動(dòng)作是MVC應(yīng)用程序中的最終請求目標(biāo),它使用控制器基類。我們來看看請求處理。
當(dāng)URL到達(dá)時(shí),如/Home/index
,這是一個(gè)UrlRoutingModule
,它檢查并理解路由表中配置的內(nèi)容并知道如何處理該URL。
UrlRoutingModule
將在路由表中配置的信息放在一起,并將控制交給MVC路由處理程序。
MvcHandler
。MvcHandler
使用一個(gè)控制器工廠實(shí)例化控制器,它知道實(shí)例化哪個(gè)控制器,因?yàn)樗谠摽刂破髦档?code>RouteData中查找。MvcHandler
有一個(gè)控制器,MvcHandler
唯一知道的就是IController
接口,所以它只是告訴控制器執(zhí)行。Execute
方法創(chuàng)建一個(gè)動(dòng)作調(diào)用者,并告訴動(dòng)作調(diào)用者去找到一個(gè)方法來調(diào)用,找到一個(gè)調(diào)用的動(dòng)作。RouteData
中查找并找到從路由引擎?zhèn)鬟f的動(dòng)作參數(shù)。動(dòng)作基本上返回不同類型的動(dòng)作結(jié)果。ActionResult
類是所有操作結(jié)果的基礎(chǔ)。 以下是不同種類的行為結(jié)果及其行為的列表。
編號(hào) | 名稱 | 行為 |
---|---|---|
1 | ContentResult |
返回一個(gè)字符串 |
2 | FileContentResult |
返回文件內(nèi)容 |
3 | FilePathResult |
返回文件內(nèi)容 |
4 | FileStreamResult |
返回文件內(nèi)容 |
5 | EmptyResult |
什么都不返回 |
6 | JavaScriptResult |
返回腳本執(zhí)行 |
7 | JsonResult |
返回JSON格式的數(shù)據(jù) |
8 | RedirectToResult |
重定向到指定的網(wǎng)址 |
9 | HttpUnauthorizedResult |
返回403 HTTP狀態(tài)碼 |
10 | RedirectToRouteResult |
重定向到不同的動(dòng)作/不同的控制器動(dòng)作 |
11 | ViewResult |
作為視圖引擎的響應(yīng)收到 |
12 | PartialViewResult |
作為視圖引擎的響應(yīng)收到 |
我們來看看前一章(ASP.Net MVC控件器的MVCControllerDemo項(xiàng)目)中創(chuàng)建EmployeeController
的一個(gè)簡單示例。參考以下示例代碼 -
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);
}
}
}
當(dāng)請求以下URL:http://localhost:51066/Employee/Maxsu
時(shí),將收到操作的輸出如下 -
現(xiàn)在,在項(xiàng)目上再添加另一個(gè)控制器。
第1步 - 通過在解決方案資源管理器 中右鍵單擊 Controllers
文件夾來添加一個(gè):控制器:CustomerController
。選擇:添加 -> 控制器 。如下所示 -
它將顯示“添加基架” 對(duì)話框。如下所示 -
第2步 - 選擇MVC 5控制器 - 空 選項(xiàng),然后單擊“添加” 按鈕。添加控制器對(duì)話框?qū)⒊霈F(xiàn)。
第3步 - 將名稱設(shè)置為:CustomerController
,然后單擊“添加” 按鈕。
現(xiàn)在,已經(jīng)在Controllers文件夾中看到一個(gè)新的 C# 文件“CustomerController.cs” ,在Visual Studio中打開并進(jìn)行編輯,如下所示 -
同樣,再添加一個(gè)名為HomeController的控制器。 以下是HomeController.cs類的實(shí)現(xiàn)。參考代碼 -
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步 - 運(yùn)行此應(yīng)用程序,將收到以下輸出 -
第5步 - 在上面創(chuàng)建的CustomerController.cs類中添加一個(gè)方法,如以下代碼 -
public string GetAllCustomers(){
return @"<ul>
<li>Max Su</li>
<li>Mark Jasper</li>
<li>Allan Java</li>
<li>Ruby Jerry</li>
</ul>";
}
第6步 - 運(yùn)行該應(yīng)用程序并請求URL: http://localhost:51066/Customer/GetAllCustomers
,將看到以下輸出 -
也可以重定向到同一控制器的操作,甚至是不同的控制器。以下是一個(gè)簡單的例子,將通過使用以下代碼更改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()
方法,它有兩個(gè)參數(shù):操作名稱和控制器名稱。
當(dāng)運(yùn)行這個(gè)應(yīng)用程序時(shí),會(huì)看到默認(rèn)路由將重定向到/Customer/GetAllCustomers