声明:
- 毕竟不是MS专业翻译,翻得不好不要打我
- 我翻译它的主要目的在过程中学习,有加入自己的理解,一些太入门、太啰嗦的话我就略掉了
原文地址在:
http://quickstarts.asp.net/3-5-extensions/mvc/MVCControllerActions.aspx
控制器、控制器的动作方法
概要
ASP.NET MVC框剪将URL映射到对应的控制器后,由控制器负责处理用户的输入,执行对应的逻辑。然后,控制器通常会通过显示部件来生成HTML输出。显示部件并不属于控制器,它是独立的。
Controller类提供基本的MVC处理模型,它是所有控制器的基类。Controller实现IController, IActionFilter, 和 IDisposable 这些接口。
所有Controller的继承类都要负责处理以下各阶段的工作:
- 定位要调用的动作方法(action method),验证它是否可以被调用
- 获取用来调用动作方法的参数值
- 处理动作方法执行过程中的错误
- 提供默认的WebFormViewFactory类来负责生成ASP.NET页面(显示)
所有控制器类在命名时,必须以Controller结尾。
下例的Controller类包括有多个动作方法,它们并提供生成view的方法:
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
ViewData["Title"] = "About Page";
return View();
}
}
动作方法 (Action Methods)
不使用MVC框架的ASP.NET应用程序,用户的交互设计都围绕页面(page)来组织,以这些页面上事件的引发、处置为焦点。
在MVC框架中,不同点是这些交互都是围绕控制器和动作方法来组织。在控制器中定义动作方法,而方法个数不限。
一般来说,动作方法与用户操作是一一对应的。例如,在浏览器中输入URL地址、点击连接、提交表单等等。 当请求被发送到服务器,MVC框架会分析URL,提取所需的信息以分辨对应的控制器和动作。
默认情况下,请求的路径被分析为包含控制器名称+动作方法名称的子路径。
例如,当用户输入 http://contoso.com/MyWebSite/Products/Categories 时,子路径是/Products/Categories
默认的route规则会将Products视为控制器名,而Categories视为动作方法名。
返回值类型 ActionResult
所有的动作方法必须有返回值,虽然返回值可以各不相同,但都必须是ActionResult类的继承类的实例。我们经常见到调用View方法的做法。其实View方法返回的是ViewResult实例,ViewReult正是ActionResult的继承类。
内置的ActionResult类包括 (很容易理解,不翻译了):
- ViewResult. 由 View 方法返回
- RedirectToRouteResult. 由 RedirectToAction 和 RedirectToRoute 方法返回
- RedirectResult. Returned by the Redirect method.
- ContentResult. Returned by the Content method.
- JsonResult. Return by the Json method.
- EmptyResult. Returned if the action method must return a null result.
将public方法标记为“非动作”方法
控制器的所有公共方法都被MVC框架视为动作方法。如果控制器有某些公共方法,你如果并不希望被视为动作方法的话,必须用NonAction属性标记出来。
动作方法的参数
默认情况下,我们是从Request对象的集合中读取动作方法所需的参数的,Request对象集合是“name/value”对,包括表单数据、Query string数据和cookie值。
控制器类定位对应的动作方法,并根据RouteData实例和表单数据来决定其所需的参数。如果参数值不能被解析将引发异常,除非参数类型是引用类型或nullable值类型。在这种情况中将传递null作为参数值。
在动作方法中,可通过几种方法来访问URL参数值。首先,Controller基类会暴露Request和Response对象,可以利用这个。这两个对象在语义上和ASP.NET中的HttpRequest 和 HttpResponse 相同,不同点是前者的基类分别是System.Web.HttpRequestBase 和 System.Web.HttpResponseBase。它们不是密封类(sealed class)。这个特点让创建模拟的对象(mock objects)变得很容易——使用模拟对象,我们可以很轻松地对控制器做单元测试。
下例中,我们使用Request对象来读取query string的值id:
{
int id = Convert.ToInt32(Request[ " id " ]);
}
自动映射动作方法参数
MVC框架可以自动映射URL的参数值到动作方法。默认的流程是这样的:如果动作方法采用一个参数,MVC框架会检查请求数据,看看HTTP request中是否包含与参数名同名的值。如果有,就自动传递给动作方法。
看下面的例子,我们假定id参数被映射到请求中的同名值,在这种情况下,由于存在自动映射,我们就不用像前一个例子那样,要自己解析参数了,用起来比较轻松些。
{
ViewData[ " DetailInfo " ] = id;
return View( " Detail " );
}