ASP.NET MVC三个重要的描述对象:ActionDescriptor2012-08-28 博客园 Artech在Model绑定过程中会通过激活的Controller类型创建用于描述它的 ControllerDescriptor对象。Controller是一组Action方法的集合,而每一个 Action通过ActionDescriptor对象来表示,在这篇文章中我们就来着重谈谈不同 类型的ActionDescriptor。[本文已经同步到《How ASP.NET MVC Works?》中]一、ActionDescriptor用于描述定义在Controller类中的Action方法的ActionDescriptor定义如下。 属性ActionName和ControllerDescriptor表示Action的名称和描述所在 Controller的ControllerDescriptor对象。表示唯一标识的UniqueId属性由自身 类型、Controller的类型与Action名称三者派生。
 1: public abstract class ActionDescriptor : ICustomAttributeProvider
 2: {
 3: public virtual object[] GetCustomAttributes(bool inherit);
 4: public virtual object[] GetCustomAttributes(Type attributeType,bool inherit);
 5: public virtual bool IsDefined(Type attributeType, bool inherit);
 6: public virtual IEnumerable<FilterAttribute> GetFilterAttributes( bool useCache);
 7:
 8: public abstract ParameterDescriptor[] GetParameters();
 9: public abstract object Execute(ControllerContext controllerContext,IDictionary<string, object> parameters);
10: public virtual ICollection<ActionSelector> GetSelectors();
11: public virtual FilterInfo GetFilters();
12: 
13: public abstract string ActionName { get; }
14: public abstract ControllerDescriptor ControllerDescriptor { get; }
15: public virtual string UniqueId { get; }
16: }
与ControllerDescriptor一样,ActionDescriptor同样实现了定义在 ICustomAttributeProvider接口中的方法,我们可以通过相应的方法得到应用在 Action方法上的相关特性,或者判断某个指定的特性是否应用在对应的Action方 法上。GetFilterAttributes方法用于返回应用在Action方法上的所有筛选器特性 。用于描述Action方法中所有参数的ParameterDescriptor数组通过方法 GetParameters返回。Action方法的执行可以直接通过调用方法Execute来完成, 该方法的两个参数controllerContext和parameters分别代表Action方法执行所在 的Controller上下文和传入的参数。GetSelectors方法用于返回一组表示Action选择器的类型为ActionSelector的 对象,而ActionSelector是一个委托类型。如下面的代码片断所示, ActionSelector委托具有唯一的类型为ControllerContext的参数,布尔类型的返 回值表示目标Action方法是否与指定的Controller上下文相匹配。该方法默认返 回的是一个空的ActionSelector集合。
 1: public delegate bool ActionSelector(ControllerContext controllerContext);
ActionDescriptor的GetFilters方法返回的是一个FilterInfo类型的对象,我 们通过这个对象可以得到应用在该Action方法上所有的筛选器。如下面的代码所 示,FilterInfo具有四个只读的集合属性,分别代码应用在该Action方法上的四 种类型的筛选器(ActionFilter、AuthorizationFilter、ExceptionFilter和 ResultFilter)。
 1: public class FilterInfo
 2: {
 3: public IList<IActionFilter>         ActionFilters { get; }
 4: public IList<IAuthorizationFilter>  AuthorizationFilters { get; }
 5: public IList<IExceptionFilter>ExceptionFilters { get; }
 6: public IList<IResultFilter>         ResultFilters { get; }
 7: }
二、AsyncActionDescriptor异步版本的ActionDescriptor通过AsyncActionDescriptor类型表示,它用于 描述定义在AsyncController中的异步方法。如下面的代码片断所示, AsyncActionDescriptor是一个继承自ActionDescriptor的抽象类,它重写了 Execute方法,并且定义了两个用于异步执行Action方法的抽象方法 BeginExecute/EndExecute。
 1: public abstract class AsyncActionDescriptor : ActionDescriptor
 2: {
 3: public abstract IAsyncResult BeginExecute( ControllerContext controllerContext, IDictionary<string, object> parameters, AsyncCallback callback,object state);
 4: public abstract object EndExecute(IAsyncResult asyncResult);
 5: public override object Execute(ControllerContext controllerContext,IDictionary<string, object> parameters);
 6: }
实际上AsyncActionDescriptor重写的Execute方法并没有实现任何Action方法 执行的逻辑,而是直接抛出一个InvalidOperationException异常,意味用于同步 执行Action操作的Execute方法在这里无效。