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][]; }