原文地址:http://www.asp.net/mvc/tutorials/asp-net-mvc-controller-overview-cs
本指南探讨ASP.NET MVC控制器(Controller),控制器操作(Action)和操作结果(Result)的话题。在你读完本指南后,你将理解怎样使用控制器来控制访问者和ASP.NET MVC站点的交互。
理解控制器(Controller)
MVC控制器用来响应对ASP.NET MVC站点的请求。每一个浏览器的请求被映射到特定的控制器上。比如,假设你在浏览器地址栏中输入下面的地址:
http://localhost/Product/Index/3
在此情况下,一个叫ProductController的控制器被调用,它负责响应生成对浏览器的请求。比如,它可能返回一个特定的视图(View)给浏览器,或者跳转用户到另一个控制器。
列表1-Controllers\ProductController.cs
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中看到的,一个控制器只是一个类(VB.NET或C#类)。控制器是继承自System.Web.Mvc.Controller的类。因为控制器继承这个基类,所以控制器也继承了一些有用的方法(我们一会再讨论这些方法)。
理解控制器操作(Action)
控制器提供操作。每个操作都是你在浏览器的地址栏中输入特定地址时控制器调用的方法。比如,假设你请求以下地址:
http://localhost/Product/Index/3
在此情况下,类ProductController的Index()方法被调用。Index()方法就是控制器操作的例子。
一个操作(Action)必须是控制器类的公开的(public)方法,默认C#方法是私有的(private).则任何你添加到控制器公开的方法,都会自动提供控制器操作(*对此必须注意,以免控制器操作被任何人在浏览器地址栏输入正确的地址后调用)。
对与控制器操作还有其他要求。做为控制器操作的方法不能被重载(overload),再者,控制器操作不能是静态方法。除此之外,你可以使用几乎任何方法作为控制器操作。
理解操作结果(Action Result)
操作结果(action result)是控制器操作返回的内容。操作结果是对浏览器请求的响应。
ASP.NET MVC框架支持结果类型包括:
1,ViewResult-表示HTML和标记
2,EmptyResult-表示无结果
3,RedirectResult-表示跳转到一个新地址
4,JsonResult-表示可以在AJAX使用的JavaScript Object Notation结果
5,JavaScriptResult-表示Javascript脚本
6,ContentResult-表示文本结果
7,FileContentResult-表示可下载的文件(二进制内容)
8,FilePathResult-表示可下载的文件(文件路径)
9,FileStreamResult-表示可下载的文件(文件流)
所有这些操作结果都继承自ActionResult类。
在大多数情况下,控制器操作返回ViewResult.比如,在列表2中的Index控制器操作返回一个ViewResult。
列表2-Controller\BookController.cs
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();
}
}
}
当一个操作返回一个ViewResult是,HTML被返回浏览器。列表2中的Index方法返回一个叫Index视图给浏览器。
注意列表2中的Index()操作不会返回一个ViewResult.而是控制器基类的View()方法被调用。一般的,你不会直接返回一个操作结果,而是你调用调用控制器基类中的以下方法:
1,View - 返回一个ViewResult结果
2,Redirect - 返回一个RedirectResult结果
3,RedirectToAction - 返回一个RedirectToActionResult结果
4,RedirectToRoute - 返回一个RedirectToRouteResult结果
5,Json - 返回一个JsonResult结果
6,JavaScriptResult - 返回一个JavaScriptResult
7,Content - 返回一个ContentResult结果
8,File - 根据方法的参数返回一个FileContentResult,FilePathResult或者FileStreamResult
所以,如果你想返回视图(View)给浏览器,你可以调用View()方法。如果你想使用户从一个控制器跳转到另一个,你可以调用RedirectToAction()方法。比如,列表3中Detais()操作根据参数Id是否有值要么显示一个视图,要么跳转用户到Index()操作。
列表3 - CustomerController.cs
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操作结果比较特殊。你可以使用ContentResult返回文本结果。比如,列表4中的Index()方法返回文本信息而不是HTML.
列表4 - Controllers\StatusController.cs
namespace MvcApplication1.Controllers
{
public class StatusController : Controller
{
public ActionResult Index()
{
return Content("Hello World!");
}
}
}
当StatusController.Index()操作被调用时,不会返回一个视图,而是返回“Hello World!"的纯文本给浏览器。
如果控制器操作没有返回操作结果 - 比如,一个时间值或这一个整数值 - 那么结果被ContentResult自动处理。比如,列表5中WorkController的Index()操作被调用,时间值会自动作为ContentResult返回。
列表5 - WorkController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class WorkController : Controller
{
public DateTime Index()
{
return DateTime.Now;
}
}
}
列表5中的Index()操作返回一个日期时间对象。ASP.NET MVC框架日期时间对象装换为一个字符并自动用ContentResult进行处理。浏览器获得日期和时间文本。
综上所述
本指南是向你介绍ASP.NET MVC控制器,控制器操作和控制器操作结果的概念。在第一节中,你学了怎样向ASP.NET MVC项目添加新的控制器,接下来,你学了控制器的公共的方法怎样公开为作为控制器操作。最后,我们探讨了控制器操作返回的不同的操作结果。特别的,我们探讨了怎样从控制器操作返回ViewResult,RedirectToAction和ContentResult。