了解控制器、控制器操作和操作结果
本教程深入研究 ASP.NET MVC 控制器、控制器操作和操作结果。学习完本教程后,您将了解如何使用控制器控制访问者与 ASP.NET MVC 网站交互的方式。
了解控制器
MVC 控制器负责响应针对 ASP.NET MVC 网站发出的请求。每个浏览器请求被映射到一个特定的控制器。例如,假设将下面的 URL 输入到浏览器的地址栏:
http://localhost/Product/Index/3
在这种情况下,将激活名称为 ProductController 的控制器。ProductController 负责响应浏览器请求。例如,控制器可能向浏览器返回特定的视图,或者控制器可能将用户重定向到另一个控制器。
通过向 ASP.NET MVC 应用程序的 Controllers 文件夹添加新的控制器,可以创建新的控制器。右键单击 Controller 文件夹并选择菜单选项 Add,New Item,然后选择 MVC Controller Class 模板,如图 1 所示。控制器名称必须包含后缀 Controller。例如,控制器名称 ProductController 完全符合要求,而 Product 则为无效名称。
图 1:创建新的控制器( 单击查看大图)
如果创建新的名称为 ProductController 的控制器,则将得到如程序清单 1 中的文件。
程序清单 1 ProductController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
-
- namespace MvcApp.Controllers
- {
- public class ProductController : Controller
- {
- public ActionResult Index()
- {
- // Add action logic here
- throw new NotImplementedException();
- }
- }
- }
如程序清单 1 所示,控制器只是一个类(Visual Basic .NET 或 C# 类)。控制器是派生自基础类 System.Web.Mvc.Controller 的类。由于控制器继承自这个基础类,所以控制器自由地继承了许多有用的方法(稍后我们将讨论这些方法)。
了解控制器操作
控制器公开控制器操作。操作是控制器上的方法,在浏览器的地址栏中输入特定 URL 时被调用。例如,假设要请求下面的 URL:
http://localhost/Product/Index/3
在这种情况下,调用 ProductController 类上的 Index() 方法。Index() 方法是控制器操作的一个示例。
控制器操作必须是控制器类的公共方法。默认情况下,C# 方法是私有方法。请注意,任何添加到控制器类的公共方法都自动公开为控制器操作(必须小心对待这个问题,因为任何人都可以简单地通过在浏览器地址栏中键入正确的 URL 激活控制器操作)。
控制器操作还必须满足一些其他要求。用作控制器操作的方法不能重载。更进一步讲,控制器操作不能是静态方法。除此之外,可以将任何方法用作控制器操作。
了解操作结果
控制器操作返回的内容称为操作结果。操作结果是控制器响应浏览器请求而返回的内容。
ASP.NET MVC Framework 支持 6 种标准类型的操作结果:
- ViewResult – 代表 HTML 和标记。
- EmptyResult – 代表无结果。
- RedirectResult – 代表重定向到新的 URL。
- RedirectToRouteResult – 代表重定向到新的控制器操作。
- JsonResult – 代表可以在 AJAX 应用程序中使用的 JavaScript Object Notation 结果。
- ContentResult – 代表文本结果。
所有这些操作结果都继承自基础的 ActionResult 类。
在大多数情况下,控制器操作返回 ViewResult。例如,程序清单 2 中的 Index 控制器操作返回 ViewResult。
程序清单 2 BookController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
-
- namespace MvcApp.Controllers
- {
- public class BookController : Controller
- {
- public ActionResult Index()
- {
- return View();
- }
- }
- }
当操作返回 ViewResult 时,向浏览器返回 HTML。程序清单 2 中的 Index() 方法将名称为 Index.aspx 的视图返回给浏览器。
请注意,程序清单 2 中的 Index() 操作未返回 ViewResult()。而是调用了 Controller 基础类的 View() 方法。通常,不直接返回操作结果。而是调用以下 Controller 基础类的方法之一:
- View – 返回 ViewResult 操作结果。
- Redirect – 返回 RedirectResult 操作结果。
- RedirectToAction – 返回 RedirectToRouteResult 操作结果。
- RedirectToRoute – 返回 RedirectToRouteResult 操作结果。
- Json – 返回 JsonResult 操作结果。
- Content – 返回 ContentResult 操作结果。
所以,如果希望将 View 返回给浏览器,则需要调用 View() 方法。如果希望将用户从一个控制器操作重定向到另一个控制器操作,则需要调用 RedirectToAction() 方法。例如,程序清单 3 中的 Details() 操作显示一个视图或将用户重定向到 Index() 操作,具体取决于 ID 参数是否拥有值。
程序清单 3 CustomerController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
-
- namespace MvcApp.Controllers
- {
- public class CustomerController : Controller
- {
- public ActionResult Details(int? Id)
- {
- if (Id == null)
- return RedirectToAction("Index");
- return View();
- }
-
- public ActionResult Index()
- {
- return View();
- }
- }
- }
ContentResult 操作结果比较特殊。可以使用 ContentResult 操作结果返回一个纯文本操作结果。例如,程序清单 4 中的 Index() 方法返回纯文本消息,而不是 HTML 消息。
程序清单 4 StatusController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
-
- namespace MvcApp.Controllers
- {
- public class StatusController : Controller
- {
- public ContentResult Index()
- {
- return Content("Hello World!");
- }
- }
- }
当激活 StatusController.Index() 操作时,不返回视图。而是向浏览器返回原始的文本“Hello World!”。
如果控制器操作返回的结果不是操作结果 – 例如,一个日期或整数 – 那么结果自动封装在 ContentResult 中。例如,程序清单 5 中的 WorkController 的 Index() 操作被激活时,自动将日期作为 ContentResult 返回。
程序清单 5 WorkController.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
-
- namespace MvcApp.Controllers
- {
- public class WorkController : Controller
- {
- public DateTime Index()
- {
- return DateTime.Now;
- }
- }
- }
程序清单 5 中的 Index() 操作返回 DateTime 对象。ASP.NET MVC Framework 将 DateTime 对象转换为字符串,并将 DateTime 值自动封装在 ContentResult 中。浏览器检索纯文本日期和时间。
总结
本教程的目的是向读者介绍 ASP.NET MVC 控制器、控制器操作和控制器操作结果的概念。在第一部分中,我们学习了如何向 ASP.NET MVC 项目添加新控制器。接下来,我们学习了如何将控制器的公共方法作为控制器操作公开。最后,我们讨论了可以从控制器操作返回的不同类型的操作结果。我们还专门讨论了如何从控制器操作返回 ViewResult、RedirectToActionResult 和 ContentResult。