【转载】ASP.NET MVC框架之控制器Controller(五)

一,基本概念:
控制器涉及的内容有三部分: 控制器(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

原文地址:https://www.cnblogs.com/fx2008/p/2436288.html