コード例 #1
0
        /// <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 ?? "";
        }
コード例 #2
0
        /// <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);
        }