首页 > 代码库 > 初识MVC-controller随笔

初识MVC-controller随笔

 初识MVC-controller随笔

技术分享

 

 

 

 

 

 

 

 

 

 

 

之前用的一些其他框架,也没有系统性的学习MVC框架。最近才开始接触,给大家简单的分享一下经验。

1    MVC的核心就是Controller(控制器),它负责处理浏览器传送过来的所有请求,并决定要将什么内容响应给浏览器。但Controller并不负责决定内容应该如何显示,而是将特定形态的内容响应给MVC架构,最后才由MVC架构依据响应的形态来决定如何将内容响应给浏览器。如何决定响应内容是View的责任。

2   Controller本身就是一个类(Class),该类有许多方法(Method)。在这些方法中,只要是公开方法,该方法就会被视为是一种动作(Action);只要有动作存在,就可以通过该动作方法接收网页请求并决定响应视图。

技术分享

3   使用controller时应满足的条件

  • Controller必须为公开类
  • Controller的名称必须以"Controller"结尾
  • 必须继承自MVC内置的Controller类,或继承自实现IController接口的自定义类,或自行实现IController接口。
  • 所有方法必须为公开方法。该方法可以没有参数,也可以有多个参数。

4 controller的执行过程

   Controller被MvcHandler选中之后,下一步就是通过ActionInvoker选取适当的Action来执行。在Controller中,每一个Action可以定义0到多个参数。ActionInvoke会依据当前的RouteValue及客户端传过来的信息准备好可输入Action参数的依据,最后正式调用被Controller选中的那个Action方法。Action执行完后的返回值通常是ActionResult类的。事实上,ActionResult类是一个抽象类,因此,MVC本身就实现了许多不同ActionResult类的子类。Controller得到ActionResult类之后,就会开始执行ActionResult类的ExecuteResult()方法,并将执行的结果返回客户端。这时,Controller的任务就算完成了。

5 action动作名称选取器

      通过ActionInvoker选取Controller中的公开方法时默认会执行Index()方法。

  如果Action中加入ActionName属性,并将其指名为"Default",此时,若RouteValue表达式中的Action是"Index",就不会执行Index()方法,而必须使RouteValue表达式中的Action为"Default",Index()方法才能被正确执行,这就是动作名称选取器(Action Name Selector)的作用,示例如下。

1   public class HomeController : Controller 2     { 3         /// <summary> 4         /// 要求网址 http://localhost/Home/Index 5         /// </summary> 6         [ActionName("Default")] 7         public ActionResult Index() 8         {            9             return View();10         }11 12     }

 唯一需要特别注意的是,如果你使用默认的"return View()"方法返回ActionResult类,由于应用了[ActionName("Default")]属性,所以MVC会去寻找"/Views/Home/Default.aspx"页面而不是"/Views/Home/Index.aspx"页面来执行。

6 动作方法选取器

    6.1  NonAction属性

    若将NonAction属性应用在Controller中的Action方法上,即便该Action方法是公开方法,也会告知ActionInvoke不要选取这个Action来执行。这个属性主要用来保护Controller中的特定公开方法不会被发布到Web上。或是当功能尚未开发完成就要进行部署时,若暂时不想将此方法删除,也可应用这个属性,表示"不要对外公开"。

  [NonAction]        public ActionResult Index()         {           return View();         }

 将Action方法中的"public"修改成"privare",也可以达到同样的目的

 6.2  HttpGet属性、HttpPost属性、HttpDelete属性和HttpPut属性

  HttpGet、HttpPost、HttpDelete和HttpPut属性是动作方法选取器的一部分,我们以下列程序为例进行介绍。若应用了[httpPost]属性,表示只有当客户端浏览器发送HTTP POST请求时才可以选取这个Action。  

 [HttpPost]2         private ActionResult Index()3         {4             return View();5         }

  相反的,若果没有应用这些属性,客户端浏览器发送任何HTTP动词,都会自动选取对应的Action。

 这些属性常用在需要接受窗口数据的时候。你可以创建两个同名的Action,一个应用[HttpGet]属性来显示窗口HTML,另一个应用[HttpPost]属性来接收窗口送出的值,

7 ActionResult类

 ActionResult类是Action执行的结果,但ActionResult中并不包含执行结果,而是包含执行响应时所需的信息。当Action返回ActionResult类之后,会由MVC执行。先看看ActionResult抽象类的程序代码。在ActionResult抽象类中仅定义了一个ExecuteResult()方法来执行结果

MVC定义的ActionResult如表所示:

技术分享

 表中的Controller辅助方法在Controller类中为返回ActionResult类提供支持,如下程序可用于跳转到另一个页面。

1      [HttpPost]2         public ActionResult Post(FormCollection c)3         {4             return new RedirectResult("/");5         }

到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

初识MVC-controller随笔