声明:

- 毕竟不是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的方法:

Code


 

动作方法 (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:

public void Detail()
{
    
int id = Convert.ToInt32(Request["id"]);
}

 


自动映射动作方法参数
MVC框架可以自动映射URL的参数值到动作方法。默认的流程是这样的:如果动作方法采用一个参数,MVC框架会检查请求数据,看看HTTP request中是否包含与参数名同名的值。如果有,就自动传递给动作方法。

看下面的例子,我们假定id参数被映射到请求中的同名值,在这种情况下,由于存在自动映射,我们就不用像前一个例子那样,要自己解析参数了,用起来比较轻松些。

 

public ResultAction Detail(int id)
{
    ViewData[
"DetailInfo"= id;
    
return View("Detail");
}

 

 

posted on 2008-08-13 15:57  赵亮  阅读(763)  评论(0编辑  收藏  举报