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
