/// <summary> /// Initializes a new instance of the <see cref="PageInfo" /> class. /// </summary> /// <param name="action">The action.</param> /// <param name="controller">The controller.</param> /// <param name="area">The area.</param> /// <param name="controllerType">Type of the controller.</param> /// <param name="pageInfoAttribute">The page information attribute.</param> /// <param name="metaInfoAttribute">The meta information attribute.</param> /// <param name="menuInfoAttribute">The menu information attribute.</param> /// <param name="routeInfoAttribute">The route information attribute.</param> /// <param name="tagInfoAttribute">The tag information attribute.</param> /// <param name="visibleInfoAttribute">The visible information attribute.</param> /// <param name="relatedInfoAttributes">The related information attributes.</param> /// <param name="propertyInfoAttributes">The property information attributes.</param> /// <param name="authorizationRoles">The authorization roles.</param> // ReSharper disable once FunctionComplexityOverflow public PageInfo( string action, string controller, string area, Type controllerType, PageInfoAttribute pageInfoAttribute, MetaInfoAttribute metaInfoAttribute, MenuInfoAttribute menuInfoAttribute, RouteInfoAttribute routeInfoAttribute, TagInfoAttribute tagInfoAttribute, VisibleInfoAttribute visibleInfoAttribute, IEnumerable <RelatedInfoAttribute> relatedInfoAttributes, IEnumerable <CustomPropertyInfoAttribute> propertyInfoAttributes, string authorizationRoles) { Children = new List <PageInfo>(); Action = action; Controller = controller; Area = area; ControllerType = controllerType; Title = pageInfoAttribute != null ? pageInfoAttribute.Title : ""; SubTitle = pageInfoAttribute != null ? pageInfoAttribute.SubTitle : ""; AlternatePageUrl = (Action != "Index" ? Action : Controller).ToLowerInvariant().Trim() + "/"; PageUrl = routeInfoAttribute != null ? (string.IsNullOrEmpty(routeInfoAttribute.Url) ? AlternatePageUrl : routeInfoAttribute.Url) : AlternatePageUrl; if (!string.IsNullOrEmpty(PageUrl) && !PageUrl.EndsWith("/")) { PageUrl = PageUrl += "/"; } ParentKey = routeInfoAttribute != null ? routeInfoAttribute.ParentKey : ""; Key = routeInfoAttribute != null ? routeInfoAttribute.Key : ""; RedirectUrls = routeInfoAttribute != null ? (routeInfoAttribute.RedirectUrls ?? new string[0]) : new string[0]; BlockUrl = routeInfoAttribute?.BlockUrl ?? false; Visible = visibleInfoAttribute == null || visibleInfoAttribute.Visible; IsMenuItem = menuInfoAttribute != null; MenuOrder = menuInfoAttribute?.Order ?? 0; MenuOnlyVisibleForRoles = menuInfoAttribute?.Roles?.ToList(); IsHomePageItem = pageInfoAttribute != null && pageInfoAttribute.IsHomePageItem; MetaTitle = metaInfoAttribute != null ? metaInfoAttribute.Title : ""; MetaDescription = metaInfoAttribute != null ? metaInfoAttribute.Description : ""; MetaNoIndex = metaInfoAttribute != null && metaInfoAttribute.NoIndex; MetaNoFollow = metaInfoAttribute != null && metaInfoAttribute.NoFollow; Tags = tagInfoAttribute != null ? tagInfoAttribute.Tags : ""; Image = pageInfoAttribute != null ? pageInfoAttribute.Image : ""; Summary = pageInfoAttribute != null ? pageInfoAttribute.Summary : ""; RelatedInfos = new List <RelatedInfo>(); if (relatedInfoAttributes != null) { foreach (var relatedInfoAttribute in relatedInfoAttributes) { RelatedInfos.Add(new RelatedInfo(relatedInfoAttribute.Title, relatedInfoAttribute.Url)); } } PropertyInfos = new Dictionary <string, string>(); if (propertyInfoAttributes != null) { PropertyInfos = propertyInfoAttributes.ToDictionary(p => p.Key, p => p.Value); } AuthorizationRoles = authorizationRoles ?? ""; }
/// <summary> /// Gets the site map item information. /// </summary> /// <returns></returns> // ReSharper disable once FunctionComplexityOverflow private static IEnumerable <PageInfo> GetPageInfos() { var items = new List <PageInfo>(); try { foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(assembly => !assembly.GlobalAssemblyCache)) { Type[] assemblyTypes; try { assemblyTypes = assembly.GetTypes(); } catch (Exception) { continue; } foreach (var controllerType in assemblyTypes) { if (!controllerType.IsSubclassOf(typeof(Controller))) { continue; } var authorizeAttributeController = controllerType.GetCustomAttributes(typeof(AuthorizeAttribute), true).Cast <AuthorizeAttribute>().FirstOrDefault(); bool?hasControllerAuthorizeAttribute = null; if (authorizeAttributeController != null) { hasControllerAuthorizeAttribute = true; } var allowAnonymousAttributeController = controllerType.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Cast <AllowAnonymousAttribute>().FirstOrDefault(); bool?hasControllerAllowAnonymousAttribute = null; if (allowAnonymousAttributeController != null) { hasControllerAllowAnonymousAttribute = true; } var mi = controllerType.GetMethods(); foreach (var m in mi) { if (!m.IsPublic || m.ReturnParameter == null) { continue; } var methodOk = typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType) || typeof(Task <ActionResult>).IsAssignableFrom(m.ReturnParameter.ParameterType); if (!methodOk) { continue; } var httpGetAttribute = m.GetCustomAttributes(typeof(HttpGetAttribute), true).Cast <HttpGetAttribute>().FirstOrDefault(); if (httpGetAttribute == null) { var httpPostAttribute = m.GetCustomAttributes(typeof(HttpPostAttribute), true).Cast <HttpPostAttribute>().FirstOrDefault(); if (httpPostAttribute != null) { continue; // no HttpPost actions } } var authorizeAttributeAction = m.GetCustomAttributes(typeof(AuthorizeAttribute), true).Cast <AuthorizeAttribute>().FirstOrDefault(); var authorizationRoles = authorizeAttributeAction != null ? authorizeAttributeAction.Roles : ""; bool?hasActionAuthorizeAttribute = null; if (authorizeAttributeAction != null) { hasActionAuthorizeAttribute = true; } var allowAnonymousAttributeAction = m.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).Cast <AllowAnonymousAttribute>().FirstOrDefault(); bool?hasActionAllowAnonymousAttribute = null; if (allowAnonymousAttributeAction != null) { hasActionAllowAnonymousAttribute = true; } var area = FindAreaForControllerType(controllerType); var ignoreByPageInfoFactoryAttribute = m.GetCustomAttributes(typeof(IgnorePageInfoAttribute), true).Cast <IgnorePageInfoAttribute>().FirstOrDefault(); if (ignoreByPageInfoFactoryAttribute != null) { continue; } var allowRouteIfEqualsConfigurationAttributes = m.GetCustomAttributes(typeof(AllowRouteIfEqualConfigAttribute), true).Cast <AllowRouteIfEqualConfigAttribute>(); var allowRouteIfEqualsConfigurationAttributesArray = allowRouteIfEqualsConfigurationAttributes as AllowRouteIfEqualConfigAttribute[] ?? allowRouteIfEqualsConfigurationAttributes.ToArray(); var include = allowRouteIfEqualsConfigurationAttributesArray.Length <= 0 || allowRouteIfEqualsConfigurationAttributesArray.Any(allowRouteIfEqualsConfigurationAttribute => allowRouteIfEqualsConfigurationAttribute.IsAllowed()); if (!include) { continue; } var pageInfoAttribute = m.GetCustomAttributes(typeof(PageInfoAttribute), true).Cast <PageInfoAttribute>().FirstOrDefault(); var metaInfoAttribute = m.GetCustomAttributes(typeof(MetaInfoAttribute), true).Cast <MetaInfoAttribute>().FirstOrDefault(); var menuInfoAttribute = m.GetCustomAttributes(typeof(MenuInfoAttribute), true).Cast <MenuInfoAttribute>().FirstOrDefault(); var routeInfoAttribute = m.GetCustomAttributes(typeof(RouteInfoAttribute), true).Cast <RouteInfoAttribute>().FirstOrDefault(); var tagInfoAttribute = m.GetCustomAttributes(typeof(TagInfoAttribute), true).Cast <TagInfoAttribute>().FirstOrDefault(); var relatedInfoAttributes = m.GetCustomAttributes(typeof(RelatedInfoAttribute), true).Cast <RelatedInfoAttribute>(); var visibleInfoAttribute = m.GetCustomAttributes(typeof(VisibleInfoAttribute), true).Cast <VisibleInfoAttribute>().FirstOrDefault(); var propertyInfoAttributes = m.GetCustomAttributes(typeof(CustomPropertyInfoAttribute), true).Cast <CustomPropertyInfoAttribute>(); if (pageInfoAttribute == null && metaInfoAttribute == null && menuInfoAttribute == null && routeInfoAttribute == null && tagInfoAttribute == null && relatedInfoAttributes == null && visibleInfoAttribute == null && propertyInfoAttributes == null) { continue; } if (pageInfoAttribute == null) { continue; } var controllerDescriptor = new ReflectedControllerDescriptor(controllerType); var actionDescriptor = new ReflectedActionDescriptor(m, m.Name, controllerDescriptor); var createController = typeof(ControllerContextFactory).GetMethod("CreateController"); var genericCreateController = createController.MakeGenericMethod(controllerType); var controllerContext = ((Controller)genericCreateController.Invoke(null, new object[] { null })).ControllerContext; bool?hasGlobalAuthorizeAttribute = null; bool?hasGlobalAllowAnonymousAttribute = null; foreach (var provider in FilterProviders.Providers) { var filter = provider.GetFilters(controllerContext, actionDescriptor).FirstOrDefault(f => f.Instance is AuthorizeAttribute); if (filter != null) { hasGlobalAuthorizeAttribute = true; } filter = provider.GetFilters(controllerContext, actionDescriptor).FirstOrDefault(f => f.Instance is AllowAnonymousAttribute); if (filter != null) { hasGlobalAllowAnonymousAttribute = true; } if (hasGlobalAuthorizeAttribute.HasValue || hasGlobalAllowAnonymousAttribute.HasValue) { break; } } if (routeInfoAttribute == null) { routeInfoAttribute = new RouteInfoAttribute(); } if (string.IsNullOrEmpty(routeInfoAttribute.Key)) { routeInfoAttribute.Key = $"{area}{controllerType.Name.Replace("Controller", "")}{m.Name}"; } if (string.IsNullOrEmpty(routeInfoAttribute.Url)) { routeInfoAttribute.Url = $"{m.Name}/"; } if (metaInfoAttribute == null) { metaInfoAttribute = new MetaInfoAttribute(); } if (string.IsNullOrEmpty(metaInfoAttribute.Title)) { metaInfoAttribute.Title = pageInfoAttribute.Title; } if (string.IsNullOrEmpty(metaInfoAttribute.Description)) { metaInfoAttribute.Description = pageInfoAttribute.Title; } if (string.IsNullOrEmpty(metaInfoAttribute.Title) && string.IsNullOrEmpty(metaInfoAttribute.TitleResourceName)) { metaInfoAttribute.TitleResourceType = pageInfoAttribute.TitleResourceType; metaInfoAttribute.TitleResourceName = pageInfoAttribute.TitleResourceName; } if (string.IsNullOrEmpty(metaInfoAttribute.Description) && string.IsNullOrEmpty(metaInfoAttribute.DescriptionResourceName)) { metaInfoAttribute.DescriptionResourceType = pageInfoAttribute.TitleResourceType; metaInfoAttribute.DescriptionResourceName = pageInfoAttribute.TitleResourceName; } if (visibleInfoAttribute == null) { visibleInfoAttribute = new VisibleInfoAttribute(); int authorizeAttribute = 0; int allowAnonymousAttribute = 0; if (hasGlobalAuthorizeAttribute.HasValue && hasGlobalAuthorizeAttribute.GetValueOrDefault(false)) { authorizeAttribute = 1; } if (hasControllerAuthorizeAttribute.HasValue && hasControllerAuthorizeAttribute.GetValueOrDefault(false)) { authorizeAttribute = 2; } if (hasActionAuthorizeAttribute.HasValue && hasActionAuthorizeAttribute.GetValueOrDefault(false)) { authorizeAttribute = 3; } if (hasGlobalAllowAnonymousAttribute.HasValue && hasGlobalAllowAnonymousAttribute.GetValueOrDefault(false)) { allowAnonymousAttribute = 1; } if (hasControllerAllowAnonymousAttribute.HasValue && hasControllerAllowAnonymousAttribute.GetValueOrDefault(false)) { allowAnonymousAttribute = 2; } if (hasActionAllowAnonymousAttribute.HasValue && hasActionAllowAnonymousAttribute.GetValueOrDefault(false)) { allowAnonymousAttribute = 3; } visibleInfoAttribute.Visible = authorizeAttribute < allowAnonymousAttribute; } items.Add(new PageInfo( m.Name, controllerType.Name.Replace("Controller", ""), area, controllerType, pageInfoAttribute, metaInfoAttribute, menuInfoAttribute, routeInfoAttribute, tagInfoAttribute, visibleInfoAttribute, relatedInfoAttributes, propertyInfoAttributes, authorizationRoles)); } } } } catch (Exception ex) { throw new DataMisalignedException("PageInfo attribute failure", ex); } return(items); }