解读ASP.NET 5 & MVC6系列教程(10):Controller与Action

2019-05-22 14:11:35刘景俊

我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本章我们主要讲解Controller和Action的定义与使用,以及在MVC框架中,如何根据路由查询相应的Controller和Action。

Controller&Action的定义和使用

在新版MVC6框架中,依然提供了一个Controller基类,在这里除了依然提供了UrlRouteDataHttpContextRequestResponse以外,还提供了一个IServiceProvider类型的Resovler属性,该属于是依赖注入的容器,用于获取当前请求作用域内指定类型的实例对象。

其遵守如下规则:

继承于Microsoft.AspNet.Mvc.Controller的类肯定都是控制器,不管有没有Controller后缀。不继承Microsoft.AspNet.Mvc.Controller的自定义XXXController要作为MVC Controller的话,,则必须要引用Microsoft.AspNet.Mvc相关的程序集。如果不想让满足上述条件的Controller类作为Controller,需要在该类上加上NonControllerAttribute特性。同理,如果不想让某个Controller中的方法作为Action,则需要在该方法上加上NonActionAttribute特性。

另外还有如下几个特性需要注意:

特性 描述
ActionNameAttribute 定义Action的名称(可以和Action方法名不同)
AcceptVerbsAttribute 定义支持的Http Method名称,支持单个或多个Method。
ActivateAttribute 依赖注入的标记,可以放在具有set权限的属性或字段上。
ResponseCacheAttribute 针对某个Controller或Action设置客户端缓存。
RequireHttpsAttribute 限制必须是Https请求。
RemoteAttribute 标记为Ajax请求,服务器端不验证form表单的验证。
NonControllerAttribute 标记该类不是Controller。
NonActionAttribute 标记该方法不是Action。

Controller的查找机制

由上述章节,我们知道MVC6不仅支持正常的Controller(继承于Controller基类的子类),也支持POCO的Controller,本节我们就来研究一下Controller的查找原理机制。

首先,要判断一个类是否是Controller必须先确定有多少个程序集里定义了这样的类。Microsoft.AspNet.Mvc命名空间下的IAssemblyProvider接口就是覆盖查找所有可能定义Controller的程序集,该接口的默认实现是DefaultAssemblyProvider