教程三:理解控制器,控制器行为和行为结果
原文地址:http://www.asp.net/learn/mvc/tutorial-03-cs.aspx
本篇教程将要讨论 ASP.NET MVC 控制器,控制器行为和行为结果这几个课题。看完本篇教程后,你会理解控制器是如何控制访问者与ASP.NET MVC 网站的交互的。
理解控制器
MVC控制器负责响应ASP.NET MVC网站的请求。每个浏览器请求都会被指到一个特定的控制器。譬如,在你的浏览器中输入下面的URL地址:
http://localhost/Product/Index/3
此时,一个名为ProductController的控制器被激活了。这个ProductController负责响应浏览器的这个请求。譬如,这个控制器可以返回一个指定的视图给浏览器,或者可以把用户指到别的控制器行为。
在ASP.NET MVC 程序的Controllers文件夹里面添加一个新的控制器文件,就能新建一个控制器。右键点击控制器的文件夹,选择添加新项,再选择MVC 控制器类模板(如图1).控制器名称的后面必须包含Controller.譬如,ProductController就可以作为控制器的名称,Product就不能.
图1
添加好一个名为 ProductController 的控制器后,会生成一个包含如下代码的文件:

正如列表1中所示,每个控制器就是一个继承于System.Web.Mvc.Controller基类的类.因此,控制器里本身就自带一些有用的方法(一会再谈这些方法).
理解控制器行为
控制器会产生控制器行为.每个行为都是控制器里的一个方法。这些方法只要在浏览器地址里输入对应的URL就可以被调用.譬如,你可以输入这个URL:
http://localhost/product/index/3
这样ProductController里的Index()方法就被调用了.这就是一个控制器行为的例子.
控制器行为必须是控制器类里的公共方法.C#中,方法在默认下是私有的,要知道所有添加给控制器类的公告方法都会自动作为一个控制器行为被外界调用(你必须对此万分小心,因为只要在地址栏输入正确的URL,任何人都可以调用控制器行为).
同时对控制器行为还有一些其它方面的要求.控制器行为方法不能被重载.此外,也不能是静态方法.其他方面就还好了.
理解行为结果
控制器行为返回的是行为结果.行为结果就是控制器行为返回给浏览器请求的东西.
ASP.NET MVC 框架支持6种标准类型的行为结果:
- ViewResult - 表示HTML和标记
- EmptyResult - 表示没有结果
- RedirectResult - 表示指向一个新的URL
- RedirestToRouteResult - 表示指向一个新的控制器请求
- JsonResult - 表示返回一个JS对象,可以用在AJAX里
- ContentResult - 表示一个文本结果.
所有的这些结果都是从ActionResult基类中继承的.
在大部分情况下,控制器行为返回一个ViewResult.譬如列表2里的Index行为返回一个ViewResult.

ViewResult被返回之后,HTML就会返回到浏览器中.Index()方法返回了一个Index.aspx视图到浏览器里.
注意列表2中的Index()行为并不返回ViewResult(),而是调用了控制器基类中的View()方法.通常情况下我们不会直接返回一个行为结果,而是调用下面这些控制器基类中的方法:
- View - 返回一个ViewResult 行为结果
- Redirect - 返回一个RedirectResult 行为结果
- RedirectToAction - 返回一个RedirectToAction行为结果
- RecirectToRoute - 返回一个RedirectToRoute行为结果
- Json - 返回一个 JsonResult 行为结果
- Content - 返回一个ContentResult行为结果
所以,如果你向返回一个视图给浏览器,需要调用View()方法.如果想把用户从一个控制器行为指向另一个,就要调用RedirectToAction()方法.譬如,下面这个Detail()行为根据Id参数是否有值来决定是显示一个视图,还是把用户指向Index()行为.

ContentResult行为结果很特殊.你可以用来返回一个文本行为结果.例如,列表4中的Index()方法返回了一个文本信息而不是HTML.

当StatusController.Index()行为被使用的时候,没有返回视图,而是把"Hello World"这个纯文本信息返回给了浏览器.
如果一个控制器行为返回的结果不是行为结果 - 譬如,是一个日期或着一个整数,那这个结果就自动归类为ContentResult.譬如下面的Index()行为被调用时,date就自动地作为一个ContentResult返回.

Index()行为返回了一个DateTime对象. ASP.NET MVC框架将DateTime对象转换成字符串,并将DateTime值自动用ContentResult来传递.浏览器会获得文本格式的日期和时间.
总结
本篇教程的目的是介绍ASP.NET MVC 控制器,控制器行为和控制器行为结果的概念.在第一部分,你学习了如何在ASP.NET MVC项目里面添加一个控制器.然后你学习了控制器行为是如何作为一个公共方法开放给外界的.最后,我们讨论了行为结果返回的不同类型.特别的,我们还讨论了如何从控制器行为中返回一个ViewResult,RedirectToAction和ContentResult.