protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName) {
                if (actionName == restActionToken) {
                    // cleanup the restActionToken we set earlier
                    controllerContext.RequestContext.RouteData.Values["action"] = null;

                    List<ActionDescriptor> matches = new List<ActionDescriptor>();
                    foreach (ActionDescriptor ad in controllerDescriptor.GetCanonicalActions()) {
                        object[] acceptVerbs = ad.GetCustomAttributes(typeof(AcceptVerbsAttribute), false);
                        if (acceptVerbs.Length > 0) {
                            foreach (object o in acceptVerbs) {
                                AcceptVerbsAttribute ava = o as AcceptVerbsAttribute;
                                if (ava != null) {
                                    if (ava.Verbs.Contains(controllerContext.HttpContext.Request.GetHttpMethodOverride().ToUpperInvariant())) {
                                        matches.Add(ad);
                                    }
                                }
                            }
                        }
                    }
                    switch (matches.Count) {
                        case 0:
                            break;
                        case 1:
                            ActionDescriptor ad = matches[0];
                            actionName = ad.ActionName;
                            controllerContext.RequestContext.RouteData.Values["action"] = actionName;
                            return ad;
                        default:
                            StringBuilder matchesString = new StringBuilder(matches[0].ActionName);
                            for (int index = 1; index < matches.Count; index++) {
                                matchesString.Append(", ");
                                matchesString.Append(matches[index].ActionName);
                            }
                            return new ResourceErrorActionDescriptor(
                                controllerDescriptor,
                                HttpStatusCode.Conflict,
                                String.Format(
                                    CultureInfo.CurrentCulture,
                                    MvcResources.ResourceControllerFactory_ConflictingActions,
                                    controllerDescriptor.ControllerName,
                                    matchesString.ToString()
                                )
                            );
                    }
                }
                return base.FindAction(controllerContext, controllerDescriptor, actionName) ??
                    new ResourceErrorActionDescriptor(
                        controllerDescriptor,
                        HttpStatusCode.NotFound,
                        String.Format(
                            CultureInfo.CurrentCulture,
                            MvcResources.ResourceControllerFactory_NoActions,
                            controllerDescriptor.ControllerName
                        )
                    );
            }
            public ActionSelectorCacheItem(ControllerDescriptor controllerDescriptor)
            {
                this._actionParameterNames = new Dictionary<MethodInfo, IEnumerable<string>>();
                this._cacheListVerbKinds = new string[] { HttpMethods.Get, HttpMethods.Put, HttpMethods.Post };
                this._controllerDescriptor = controllerDescriptor;
                ActionDescriptor[] array = controllerDescriptor.GetCanonicalActions();
                this._actionDescriptors = Array.ConvertAll<ActionDescriptor, ApiActionDescriptor>(array, a => a as ApiActionDescriptor);

                var methodInfos = this._actionDescriptors.Select(a => a.MethodInfo);
                foreach (MethodInfo info in methodInfos)
                {
                    this._actionParameterNames.Add(info, from parameter in info.GetParameters()
                                                         where TypeHelper.IsSimpleType(parameter.ParameterType) && !parameter.IsOptional
                                                         select parameter.Name);
                }
                this._aliasedMethods = Array.FindAll<ApiActionDescriptor>(this._actionDescriptors, new Predicate<ApiActionDescriptor>(ApiControllerActionSelector_old.ActionSelectorCacheItem.IsMethodDecoratedWithAliasingAttribute));
                this._nonAliasedMethods = this._actionDescriptors.Except<ApiActionDescriptor>(this._aliasedMethods).ToLookup<ApiActionDescriptor, string>(actionDesc => actionDesc.MethodInfo.Name, StringComparer.OrdinalIgnoreCase);
                this._cacheListVerbs = new ApiActionDescriptor[this._cacheListVerbKinds.Length][];
            }
 private static object GetControllerModel(ControllerDescriptor controllerDescriptor, RequestContext requestContext) {
     return new {
         ControllerName = controllerDescriptor.ControllerName,
         ControllerType = new {
             Name = controllerDescriptor.ControllerType.Name,
             Namespace = controllerDescriptor.ControllerType.Namespace,
             Attributes = GetAttributesModel(controllerDescriptor.GetCustomAttributes(inherit: true))
         },
         Actions = from action in controllerDescriptor.GetCanonicalActions()
                   let reflectedAction = action as ReflectedActionDescriptor
                   select new {
                       Name = action.ActionName,
                       Id = GetActionId(action),
                       Verbs = GetVerbs(action),
                       Path = GetSamplePath(requestContext, action),
                       MethodInfo = (reflectedAction != null ? reflectedAction.MethodInfo : null),
                       ReturnType = (reflectedAction != null ? reflectedAction.MethodInfo.ReturnType : null),
                       Parameters = from parameter in action.GetParameters()
                                    select new {
                                        Name = parameter.ParameterName,
                                        Type = parameter.ParameterType,
                                        IsComplexType = IsComplexType(parameter.ParameterType),
                                        DefaultValue = parameter.DefaultValue ?? ""
                                    },
                       Attributes = GetAttributesModel(action.GetCustomAttributes(inherit: true))
                   },
         InputModels = GetInputModels(controllerDescriptor),
         GlobalFilters = from filter in GlobalFilters.Filters
                         let filterInstance = filter.Instance
                         let filterType = filterInstance.GetType()
                         select new {
                             Name = filterType.Name,
                             Namespace = filterType.Namespace,
                             Properties = from property in filterType.GetProperties()
                                          select new {
                                              Name = property.Name,
                                              Value = property.GetValue(filterInstance, null)
                                          }
                         }
     };
 }
        protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName)
        {
            ActionDescriptor[] actionDescriptors = controllerDescriptor.GetCanonicalActions();
            for (int i = 0; i < actionDescriptors.Length; i++)
            {
                var attr = actionDescriptors[i].GetCustomAttributes(typeof(AdminActionAttribute), true).FirstOrDefault() as AdminActionAttribute;
                if (attr != null)
                {
                    if (StringComparer.OrdinalIgnoreCase.Equals(actionName, attr.Name))
                        return actionDescriptors[i];
                    
                    if (StringComparer.OrdinalIgnoreCase.Equals("Index", actionName) && attr.IsDefault)
                    {
                        // reset the name, otherwise the View wont be picked up correctly
                        controllerContext.RouteData.Values["Action"] = attr.Name;
                        return actionDescriptors[i];
                    }
                }
            }

            return base.FindAction(controllerContext, controllerDescriptor, actionName);
        }
 private static IEnumerable<object> GetInputModels(ControllerDescriptor controller) {
     var models = from action in controller.GetCanonicalActions()
                  let parameters = action.GetParameters()
                  from parameter in parameters
                  let type = parameter.ParameterType
                  // using definition of complex type from ModelMetadata class
                  where IsComplexType(type)
                  select new {
                      Name = type.Name,
                      FullName = type.FullName,
                      Properties = type.GetProperties()
                  };
     return models;
 }
 protected virtual ActionDescriptor GetActionDescriptor(string actionName, ControllerDescriptor controllerDescriptor, ControllerContext controllerContext)
 {
     ActionDescriptor actionDescriptor = null;
     var found = this.TryFindActionDescriptor(actionName, controllerContext, controllerDescriptor, out actionDescriptor);
     if (!found)
     {
         actionDescriptor = controllerDescriptor.GetCanonicalActions().Where(a => a.ActionName == actionName).FirstOrDefault();
     }
     return actionDescriptor;
 }
            public ActionSelectorCacheItem(ControllerDescriptor controllerDescriptor)
            {
                this._actionParameterNames = new Dictionary<MethodInfo, string[]>();
                this._cacheListVerbKinds = new string[] { HttpMethods.Get, HttpMethods.Put, HttpMethods.Post };
                this._controllerDescriptor = controllerDescriptor;
                ActionDescriptor[] array = controllerDescriptor.GetCanonicalActions();
                this._actionDescriptors = Array.ConvertAll<ActionDescriptor, ApiActionDescriptor>(array, a => a as ApiActionDescriptor);

                foreach (var action in this._actionDescriptors)
                {
                    //this._actionParameterNames.Add(action.MethodInfo, from parameter in action.MethodInfo.GetParameters()
                    //                                                  where TypeHelper.IsSimpleType(parameter.ParameterType) && !parameter.IsOptional
                    //                                                  select parameter.Name);

                    // Build action parameter name mapping, only consider parameters that are simple types, do not have default values and come from URI
                    this._actionParameterNames.Add(
                        action.MethodInfo,
                        action.MethodInfo.GetParameters()
                            .Where(binding => TypeHelper.IsSimpleType(binding.ParameterType) && !binding.IsOptional)
                            .Select(binding => binding.Name).ToArray());
                }
                this._aliasedMethods = Array.FindAll<ApiActionDescriptor>(this._actionDescriptors, new Predicate<ApiActionDescriptor>(ApiControllerActionSelector.ActionSelectorCacheItem.IsMethodDecoratedWithAliasingAttribute));
                this._nonAliasedMethods = this._actionDescriptors.Except<ApiActionDescriptor>(this._aliasedMethods).ToLookup<ApiActionDescriptor, string>(actionDesc => actionDesc.MethodInfo.Name, StringComparer.OrdinalIgnoreCase);
                this._cacheListVerbs = new ApiActionDescriptor[this._cacheListVerbKinds.Length][];
            }