一,基本概念:
控制器涉及的内容有三部分: 控制器(Controller) 、控制器方法(Action)和 控制器结果(ActionResult)。
传统的Web框架,如ASP/PHP/ASP.NET Web Forms 等等,请求的URL 地址都是映射到特定的文件。如,请求的URL 地址,像/Products.aspx 或/Products.php,由 Products.aspx 或Products.php 文件负责处理。基于Web的MVC框架 映射URL地址 到服务器端代码有点不同,不是映射URL 地址到特定文件,而是映射到类的方法上。这些类就是MVC 中的 Controller 控制器,它们负责处理进来的请求和用户输入,接收和保存数据,并返回结果给客户端(显示HTML、下载文件、或重定向到不同的URL 等等)。
二,控制器(Controller):
右键点击Web 项目中的Controllers 文件夹,选择 添加(Add) ->控制器(Controller),如下图所示。
在弹出的Add Controller 对话框,控制器名称输入GuestBookController,点击Add 按钮。ok,我们已经在项目文件中添加了GuestBookController.cs 文件。
代码如下:
public class GuestBookController : Controller
{
//
// GET: /GuestBook/
public ActionResult Index()
{
return View();
}
}
注意:约定控制器必须以Controller结尾,样式为xyzController.cs。
三,Action方法:
1,能够通过URL访问的Action必须是公有(public)方法;
2,如果标记了[NonAction]属性,则不能通过URL访问;
例如:
[NonAction]
public ActionResult Index()
{
return View();
}
不能通过GuestBook/Index来访问了。
3,默认情况下,Action的方法名就是Action名,Action名指可以通过URL访问的名称。
如有需要,您可以指定Action名。例如:
[ActionName("Default")]
public ActionResult Index()
{
return View("Index");//改变了Action名,就要指定视图名称,不指定就会显示Default视图文件。
}
这样,您可以通过GuestBook/Default来访问这个Action了。
4,还有两个常用的属性是[HttpPost]和[HttpGet]。例如:
[HttpPost]
public ActionResult Index()
{
return View();
}
表示该方法负责处理Http Post动作。
也可以通过 [AcceptVerbs(HttpVerbs.Post)]来设置,[HttpPost]效果一样,只是方便快速开发。
当对重载的action 方法添加[HttpPost] 属性后,ASP.NET MVC 根据进来的HTTP 动作,自动分发请求
给合适的action 方法。例如:
[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost()
{
return View();
}
public ActionResult Index()
{
return View("Index");
}
URL请求GuestBook/Index时,如果是Http Post请求,则由名称为IndexPost的方法执行;其它的请求,则由名称为Index的方法执行。
如果想了解post和get以外更多的参数,请参考(英文):
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
或者搜索AcceptVerbs。
5,过滤器属性Action Filter:
可以放置在Action上的另一种类型的属性是过滤器(Filter)。
使用过滤器可以添加缓存、 验证和错误处理。
例如[HandleError]属性。
我们先去掉上图中的[HandleError]属性,然后添加如下代码:
public ActionResult HandleError()
{
throw new Exception("出现异常");
}
访问Home/HandleError,出现如下图,异常页面暴露了部分源代码,给网站安全带来隐患。
现在,我们设置 [HandleError]属性。
[HandleError]
public class HomeController : Controller
然后,在web.config中找到<customErrors>节,把mode设置为"On",去掉注释。如下图。
再次运行Home/HandleError,会显示Shared目录下的Error.aspx个性化异常页面。
这是一个过滤器的例子,更多的内容我们将在后面过滤器的章节中详细说明。
注意:可以将此属性应用于单独的一个Action方法上,或者Controller类上,这样它可以应用于这个控制器类的所有Action.
6,Action方法的参数:
例如URL为:GuestBook/Index/12345,
Index这个Action的代码为:
public ActionResult Index(int id)
{
int myid=id;
return View("Index");
}
我们调试此URL,就会发现,myid的值是12345。
我们并没有使用类似int id = Convert.ToInt32(Request["id"]);的代码。
这是因为:
默认情况下,action方法的参数值从请求的数据集合中检索。
数据集包括,Form、URL Routing Data、QueryString、cookie values等等。
Action 参数的数据首先会从当前请求的form表单中取值,之后是route解析过的route values,最后是从QueryString中取得所前面没有重复出现过的值。重复出现的以最先取的值为优先。
四,控制器结果(ActionResult):
1,成功执行 MVC 控制器操作会产生从 ActionResult 派生的对象。
2, ActionResult 派生类型包括:
ViewResult. 呈现视图页给客户端。由View 方法返回.
EmptyResult. 不写入HTTP 响应。
RedirectResult. 重定向到另外一个URL。由 Redirect 方法返回.
RedirectToRouteResult. 重定向到另外一个Route。由RedirectToAction 和RedirectToRoute 方法返回.
FileContentResult,表示一个可下载的文件,有File方法返回.
ContentResult.将动作结果作为纯文本返回。由 Content 方法返回.
JsonResult. 返回JSON结果。由 Json 方法返回.
JavaScriptResult.返回一个JavaScript对象,由JavaScriptResult方法返回。
3,你也可创建返回任何类型的action方法,如字符串、整数、或布尔值等等。在这些返回值呈现给返回流之前,将封装为合适的ActionResult类型。例如,如果设置返回类型为string或日期,会自动转换为ContentResult类型结果返回。
下一节中我们将介绍视图。
--------------------------------------------------------------------------
参考资料:
终极 ASP.NET(英文)
http://msdn.microsoft.com/zh-cn/magazine/dd695917.aspx
ASP.NET MVC框架开发系列课程(5):控制器(Controller)以及Action (Level 200)
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032378264&Culture=zh-CN
一步一步学asp.net_mvc_中文版.pdf
http://wenku.baidu.com/view/2be68e6a561252d380eb6e0a.html
MVC 中的控制器和Action方法
http://forum.entlib.com/Default.aspx?g=posts&t=935
MVC 中的控制器和Action方法(英文原文)
http://msdn.microsoft.com/en-us/library/dd410269(VS.100).aspx
ASP.NET MVC :Action参数绑定的数据源优先顺序
http://www.cnblogs.com/hjf1223/archive/2010/03/14/mvc_action_parametervalues_order.html