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