加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC:获取所有控制器

发布时间:2020-12-15 23:37:49 所属栏目:asp.Net 来源:网络整理
导读:是否可以让ControllerFactory的所有控制器可用? 我想要做的是在应用程序中获取所有控制器类型的列表,但是以一致的方式. 所以我得到的所有控制器是默认请求分辨率正在使用的相同的. (实际的任务是找到具有给定属性的所有动作方法). 解决方法 您可以使用反射
是否可以让ControllerFactory的所有控制器可用?
我想要做的是在应用程序中获取所有控制器类型的列表,但是以一致的方式.

所以我得到的所有控制器是默认请求分辨率正在使用的相同的.

(实际的任务是找到具有给定属性的所有动作方法).

解决方法

您可以使用反射枚举程序集中的所有类,并仅过滤继承自Controller类的类.

最好的参考是asp.net mvc source code.看看ControllerTypeCache和ActionMethodSelector类的实现.
ControllerTypeCache显示如何获取所有控制器类.

internal static bool IsControllerType(Type t) {
            return
                t != null &&
                t.IsPublic &&
                t.Name.EndsWith("Controller",StringComparison.OrdinalIgnoreCase) &&
                !t.IsAbstract &&
                typeof(IController).IsAssignableFrom(t);
        }

 public void EnsureInitialized(IBuildManager buildManager) {
            if (_cache == null) {
                lock (_lockObj) {
                    if (_cache == null) {
                        List<Type> controllerTypes = GetAllControllerTypes(buildManager);
                        var groupedByName = controllerTypes.GroupBy(
                            t => t.Name.Substring(0,t.Name.Length - "Controller".Length),StringComparer.OrdinalIgnoreCase);
                        _cache = groupedByName.ToDictionary(
                            g => g.Key,g => g.ToLookup(t => t.Namespace ?? String.Empty,StringComparer.OrdinalIgnoreCase),StringComparer.OrdinalIgnoreCase);
                    }
                }
            }
        }

ActionMethodSelector显示如何检查方法是否具有所需属性.

private static List<MethodInfo> RunSelectionFilters(ControllerContext controllerContext,List<MethodInfo> methodInfos) {
            // remove all methods which are opting out of this request
            // to opt out,at least one attribute defined on the method must return false

            List<MethodInfo> matchesWithSelectionAttributes = new List<MethodInfo>();
            List<MethodInfo> matchesWithoutSelectionAttributes = new List<MethodInfo>();

            foreach (MethodInfo methodInfo in methodInfos) {
                ActionMethodSelectorAttribute[] attrs = (ActionMethodSelectorAttribute[])methodInfo.GetCustomAttributes(typeof(ActionMethodSelectorAttribute),true /* inherit */);
                if (attrs.Length == 0) {
                    matchesWithoutSelectionAttributes.Add(methodInfo);
                }
                else if (attrs.All(attr => attr.IsValidForRequest(controllerContext,methodInfo))) {
                    matchesWithSelectionAttributes.Add(methodInfo);
                }
            }

            // if a matching action method had a selection attribute,consider it more specific than a matching action method
            // without a selection attribute
            return (matchesWithSelectionAttributes.Count > 0) ? matchesWithSelectionAttributes : matchesWithoutSelectionAttributes;
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读