zoukankan      html  css  js  c++  java
  • 【转载】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

  • 相关阅读:
    SpringMVC集成Swagger插件以及Swagger注解的简单使用
    Java后台直接生成二维码介绍
    Java条形码生成技术-Barcode4j
    对Java Serializable(序列化)的理解和总结(一)
    java下划线与驼峰命名互转
    Mybatis实战之TypeHandler高级进阶
    迪卡侬女主(视频) 第一集
    MySQL优化(五)
    PDO连接mysql和pgsql数据库
    MySQL的FIND_IN_SET()函数
  • 原文地址:https://www.cnblogs.com/fx2008/p/2436288.html
Copyright © 2011-2022 走看看