这篇教程探讨ASP.NET MVC控制器,控制器action和action result。完成此教程后,你会懂得控制器如何被用来控制访问者与ASP.NET MVC网站的交互方式。
理解控制器
MVC 控制器负责对ASP.NET MVC网站的请求作出回应。每一个浏览器请求都被映射到一个特定的控制器。例如,想象你在浏览器地址栏输入以下URL:
http://localhost/Product/Index/3
在这种情况下,名为ProductController的控制器被调用。ProductController 负责生成对浏览器请求的作出响应。例如,控制器会返回一个特定视图到浏览器或者将用户重定向到另一个控制器。
代码1 包含了一个名为 ProductController 的简单控制器。
代码1– Controllers\ProductController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace MvcApplication1.Controllers { public class ProductController : Controller { // // GET: /Products/ public ActionResult Index() { // Add action logic here return View(); } } }
就如你在代码1中看到的,控制器只是一个类(一个Visual Basic .NET或者C#类)。控制器继承基类 System.Web.Mvc.Controller。 由于控制器继承此基类,所以它继承了几个有用的方法(等会儿我们来讨论这些方法)。
理解控制器 Actions
控制器暴露 actions.一个 action 是一个控制器上的方法,在浏览器地址栏输入特定URL时就会被调用。例如,想象发送以下URL请求:
http://localhost/Product/Index/3
在这情况下,ProductController 类上的 Index()方法被调用。 Index() 方法就是控制器action的一个例子。
控制器action 必须是控制器类的公共方法。C#方法默认是私有方法。注意任何加到控制器类的公共方法都会自动被暴露成控制器action(你必须小心,因为任何人只要在浏览器地址栏输入正确URL都可以调用控制器action)。
满足控制器action还需要几个额外要求。用作控制器action的方法不能重载。还有,控制器action 不能是静态方法。其它的方法都可以作为控制器action。
理解 Action Result
控制器 action 返回某些被称为 action result 的东西。 action result 就是控制器action对浏览器请求作出的响应。
ASP.NET MVC 框架支持集中类型的action result,包括:
- ViewResult – 表示 HTML和标签。
- EmptyResult –表示无结果。
- RedirectResult – 表示重定向到另一个URL
- JsonResult – 表示可用于AJAX程序的 JavaScript对象符号(JSON)。
- ContentResult – 表示文本结果。
- FileContentResult – 表示可下载文件(二进制内容)。
- FilePathResult – 表示可下载文件 (路径)。
- FileStreamResult – 表示可下载文件(文件流)。
所有这些 action results 都继承于 ActionResult 基类。
在多数情况下,控制器 action返回一个 ViewResult。如代码2:
代码2 – Controllers\BookController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace MvcApplication1.Controllers { public class BookController : Controller { public ActionResult Index() { // Add action logic here return View(); } } }
当 action返回一个 ViewResult 时, HTML 返回到浏览器。代码2中的 Index() 方法返回一个名为Index的视图到浏览器。
注意代码2中的 Index() action 不返回ViewResult(),而是调用了控制器基类的View()方法。通常,不会直接返回action result,而是调用如下控制器基类方法的其中一个:
- View – 返回一个ViewResult action result.
- Redirect –返回一个 RedirectResult action result.
- RedirectToAction – 返回一个 RedirectToAction action result.
- RedirectToRoute – 返回一个 RedirectToRouteResult action result.
- Json – 返回一个 JsonResult action result.
- JavaScriptResult –返回一个 JavaScriptResult.
- Content – 返回一个 ContentResult action result.
- File – 返回一个 FileContentResult, FilePathResult,或者 FileStreamResult ,取决于传入方法的参数。
所以,如果你想返回一个视图到浏览器,就调用View()方法。如果想将用户从一个控制器action重定向到另一个,就调用RedirectToAction()方法。例如,代码3中的 Details() action 显示一个视图或者将用户重定向到Index() action,取决于Id参数是否有值。
代码3 – CustomerController.cs
using System.Web.Mvc; namespace MvcApplication1.Controllers { public class CustomerController : Controller { public ActionResult Details(int? id) { if (!id.HasValue) return RedirectToAction("Index"); return View(); } public ActionResult Index() { return View(); } } }
ContentResult action result 比较特殊。你可以用 ContentResult action result 来返回一个纯文本的 action result。例如,代码4中的 Index() 方法返回纯文本而非HTML。
代码4 – Controllers\StatusController.cs
using System.Web.Mvc; namespace MvcApplication1.Controllers { public class StatusController : Controller { public ActionResult Index() { return Content("Hello World!"); } } }
当 StatusController.Index() action 被调用时, 并不是返回一个视图,而是返回纯文本"Hello World!"到浏览器。
如果控制器 action 返回一个不是 action result 的结果 – 例如, 一个日期或者一个整数 – 那么结果会被自动封装到 ContentResult。 例如,当代码5中的WorkController的 Index() action被调用,日期会自动作为 ContentResult 返回。
代码 5 – WorkController.cs
using System; using System.Web.Mvc; namespace MvcApplication1.Controllers { public class WorkController : Controller { public DateTime Index() { return DateTime.Now; } } }
代码5中的 Index() action返回一个DateTime对象。ASP.NET MVC 框架将DateTime对象转换成字符串并将DateTime的值自动封装到 ContentResult中。浏览器收到的是纯文本形式的日期和时间。
总结
本教程的目的是向你介绍ASP.NET MVC控制器,控制器action和控制器 action result的概念。在第一节,你学到了如何添加一个新控制器到ASP.NET MVC程序。然后,你学到了控制器的公共方法如何被暴露为控制器action。最后,我们讨论了可以从控制器action 返回的action result的不同类型。特别是,我们讨论了如何从控制器action中返回一个 ViewResult, RedirectToActionResult, 和 ContentResult。
原文地址:http://www.asp.net/learn/mvc/tutorial-03-cs.aspx