public virtual string ExtractFromKey(Type type)
        {
            //Check if type is a controller without a FromAction
            if (type.IsController() && string.IsNullOrWhiteSpace(FromAction) && FromController != null)
            {
                //should only come here if type is a controller and attribute is placed at controller class level
                return(FromController.ExtractMvcControllerKey());
            }

            if (!string.IsNullOrWhiteSpace(FromAction))
            {
                var fromControllerType = FromController;

                if (fromControllerType == null)
                {
                    // Try to infer it from the type
                    if (!type.IsController())
                    {
                        throw new SmartBreadcrumbsException($"Can't infer FromController as '{type.Name}' is a Razor Page.");
                    }

                    fromControllerType = type;
                }

                if (!fromControllerType.IsController())
                {
                    throw new SmartBreadcrumbsException($"'{fromControllerType.Name}' is used in FromController but isn't a Controller.");
                }

                var actionMethod = fromControllerType.GetMethods(BindingFlags.Instance | BindingFlags.Public)
                                   .FirstOrDefault(m => m.Name == FromAction); //to prevent AmbiguousMatchException

                if (actionMethod == null || actionMethod.ReturnType.IsAction() == false)
                {
                    throw new SmartBreadcrumbsException($"{fromControllerType.Name} doesn't contain a valid action named {FromAction}.");
                }

                return(fromControllerType.ExtractMvcKey(actionMethod));
            }

            if (FromPage == null)
            {
                return(null); // Will use default as parent
            }
            if (!FromPage.IsRazorPage())
            {
                throw new SmartBreadcrumbsException($"'{FromPage.Name}' is used in FromPage but isn't a Razor Page.");
            }

            return(FromPage.ExtractRazorPageKey());
        }
        public virtual string ExtractFromKey(Type type)
        {
            if (!string.IsNullOrWhiteSpace(FromAction))
            {
                var fromControllerType = FromController;

                if (fromControllerType == null)
                {
                    // Try to infer it from the type
                    if (!type.IsController())
                    {
                        throw new SmartBreadcrumbsException($"Can't infer FromController as '{type.Name}' is a Razor Page.");
                    }

                    fromControllerType = type;
                }

                if (!fromControllerType.IsController())
                {
                    throw new SmartBreadcrumbsException($"'{fromControllerType.Name}' is used in FromController but isn't a Controller.");
                }

                var actionMethod = fromControllerType.GetMethod(FromAction, BindingFlags.Instance | BindingFlags.Public);
                if (actionMethod == null || actionMethod.ReturnType.IsAction() == false)
                {
                    throw new SmartBreadcrumbsException($"{fromControllerType.Name} doesn't contain a valid action named {FromAction}.");
                }

                return(fromControllerType.ExtractMvcKey(actionMethod));
            }

            if (FromPage == null)
            {
                return(null); // Will use default as parent
            }
            if (!FromPage.IsRazorPage())
            {
                throw new SmartBreadcrumbsException($"'{FromPage.Name}' is used in FromPage but isn't a Razor Page.");
            }

            return(FromPage.ExtractRazorPageKey());
        }