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