/// <summary> /// Gets the TreeNode for the corresponding path, can be either the NodeAliasPath or a URL Alias /// </summary> /// <param name="Path"></param> /// <returns></returns> public static TreeNode GetNodeByAliasPath(string Path, string ClassName = null, string CultureCode = null) { return(CacheHelper.Cache <TreeNode>(cs => { List <string> CacheDependencies = new List <string>(); TreeNode FoundNode = DocumentQueryHelper.RepeaterQuery(Path: Path, ClassNames: ClassName, CultureCode: CultureCode).GetTypedResult().Items.FirstOrDefault(); if (FoundNode == null) { // Check Url Aliases var FoundNodeByAlias = DocumentAliasInfoProvider.GetDocumentAliasesWithNodesDataQuery().WhereEquals("AliasUrlPath", Path).Or().Where(string.Format("'{0}' like AliasWildCardRule", SqlHelper.EscapeQuotes(Path))).FirstOrDefault(); if (FoundNodeByAlias != null && FoundNodeByAlias.AliasNodeID > 0) { CacheDependencies.Add("cms.documentalias|all"); CacheDependencies.Add(string.Format("node|{0}|{1}", SiteContext.CurrentSiteName, Path)); FoundNode = DocumentQueryHelper.RepeaterQuery(NodeID: FoundNodeByAlias.AliasNodeID, ClassNames: ClassName, CultureCode: (!string.IsNullOrWhiteSpace(FoundNodeByAlias.AliasCulture) ? FoundNodeByAlias.AliasCulture : CultureCode)).GetTypedResult().Items.FirstOrDefault(); } } if (FoundNode != null) { CacheDependencies.Add("documentid|" + FoundNode.DocumentID); } if (cs.Cached) { cs.CacheDependency = CacheHelper.GetCacheDependency(CacheDependencies.ToArray()); } return FoundNode; }, new CacheSettings(CacheHelper.CacheMinutes(SiteContext.CurrentSiteName), Path, ClassName, CultureCode))); }
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { // If no document found anyway, then it will always be a match TreeNode FoundDoc = DocumentQueryHelper.GetNodeByAliasPath(EnvironmentHelper.GetUrl(httpContext.Request)); return(FoundDoc != null && (FoundDoc.NodeAliasPath != "/" || !IgnoreRootPage)); }
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { // Don't use dynamic routing for this {controller}/* route. 'KenticoFormWidget' is the OOB Kentico Forms widget in the default installation. string ControllerName = (values.ContainsKey("controller") ? ValidationHelper.GetString(values["controller"], "") : ""); if (ControllerName.Equals("KenticoFormWidget", StringComparison.InvariantCultureIgnoreCase)) { return(false); } // If no document found anyway, then it will always be a match TreeNode FoundDoc = DocumentQueryHelper.GetNodeByAliasPath(EnvironmentHelper.GetUrl(httpContext.Request)); return(FoundDoc != null && (FoundDoc.NodeAliasPath != "/" || !IgnoreRootPage)); }
/// <summary> /// Gets the TreeNode for the corresponding path, can be either the NodeAliasPath or a URL Alias /// </summary> /// <param name="Path"></param> /// <returns></returns> public static TreeNode GetNodeByAliasPath(string Path, string ClassName = null, string CultureCode = null) { return(CacheHelper.Cache <TreeNode>(cs => { List <string> CacheDependencies = new List <string>(); TreeNode FoundNode = DocumentQueryHelper.RepeaterQuery(Path: Path, ClassNames: ClassName, CultureCode: CultureCode).GetTypedResult().Items.FirstOrDefault(); if (FoundNode != null) { CacheDependencies.Add("documentid|" + FoundNode.DocumentID); } if (cs.Cached) { cs.CacheDependency = CacheHelper.GetCacheDependency(CacheDependencies.ToArray()); } return FoundNode; }, new CacheSettings((EnvironmentHelper.PreviewEnabled ? 0 : CacheHelper.CacheMinutes(SiteContext.CurrentSiteName)), Path, ClassName, CultureCode, SiteContext.CurrentSiteName))); }
public void ProcessRequest(HttpContext context) { IController controller = null; IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory(); string DefaultController = (RequestContext.RouteData.Values.ContainsKey("controller") ? RequestContext.RouteData.Values["controller"].ToString() : ""); string DefaultAction = (RequestContext.RouteData.Values.ContainsKey("action") ? RequestContext.RouteData.Values["action"].ToString() : ""); string NewController = ""; string NewAction = "Index"; // Get the classname based on the URL TreeNode FoundNode = DocumentQueryHelper.GetNodeByAliasPath(context.Request.Url.AbsolutePath); string ClassName = FoundNode.ClassName; switch (ClassName.ToLower()) { case "": break; // can add your own cases to do more advanced logic if you wish default: // Default will look towards the classname (period replaced with _) for the Controller NewController = ClassName.Replace(".", "_"); break; } // Controller not found, use defaults if (string.IsNullOrWhiteSpace(NewController)) { NewController = DefaultController; NewAction = DefaultAction; } // Setup routing with new values this.RequestContext.RouteData.Values["Controller"] = NewController; // If there is an action (2nd value), change it to the CheckNotFound, and remove ID if (this.RequestContext.RouteData.Values.ContainsKey("Action")) { this.RequestContext.RouteData.Values["Action"] = NewAction; } else { this.RequestContext.RouteData.Values.Add("Action", NewAction); } if (RequestContext.RouteData.Values.ContainsKey("Id")) { RequestContext.RouteData.Values.Remove("Id"); } try { controller = factory.CreateController(RequestContext, NewController); controller.Execute(RequestContext); } catch (HttpException ex) { // Even that failed, log and use normal HttpErrors controller EventLogProvider.LogException("KMVCDynamicHttpHandler", "ClassControllerNotConfigured", ex, additionalMessage: "Page found, but could not find a Controller for " + NewController + ", create one with an index view to auto handle or modify the KMVCDynamicHttpHandler"); RequestContext.RouteData.Values["Controller"] = DefaultController; RequestContext.RouteData.Values["Action"] = DefaultAction; controller = factory.CreateController(RequestContext, DefaultController); controller.Execute(RequestContext); } factory.ReleaseController(controller); }
public void ProcessRequest(HttpContext context) { IController controller = null; IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory(); string DefaultController = (RequestContext.RouteData.Values.ContainsKey("controller") ? RequestContext.RouteData.Values["controller"].ToString() : ""); string DefaultAction = (RequestContext.RouteData.Values.ContainsKey("action") ? RequestContext.RouteData.Values["action"].ToString() : ""); string NewController = ""; string NewAction = "Index"; // Get the classname based on the URL TreeNode FoundNode = DocumentQueryHelper.GetNodeByAliasPath(EnvironmentHelper.GetUrl(context.Request)); string ClassName = FoundNode.ClassName; switch (ClassName.ToLower()) { default: // if (PageHasTemplate(FoundNode)) { // Uses Page Templates, send to basic Page Template handler NewController = "DynamicPageTemplate"; NewAction = "Index"; } else { // Try finding a class that matches the class name NewController = ClassName.Replace(".", "_"); } break; // can add your own cases to do more advanced logic if you wish case "": break; } // Controller not found, use defaults if (string.IsNullOrWhiteSpace(NewController)) { NewController = DefaultController; NewAction = DefaultAction; } // Setup routing with new values this.RequestContext.RouteData.Values["Controller"] = NewController; // If there is an action (2nd value), change it to the CheckNotFound, and remove ID if (this.RequestContext.RouteData.Values.ContainsKey("Action")) { this.RequestContext.RouteData.Values["Action"] = NewAction; } else { this.RequestContext.RouteData.Values.Add("Action", NewAction); } if (RequestContext.RouteData.Values.ContainsKey("Id")) { RequestContext.RouteData.Values.Remove("Id"); } try { controller = factory.CreateController(RequestContext, NewController); controller.Execute(RequestContext); } catch (HttpException ex) { // Catch Controller Not implemented errors and log and go to Not Foud if (ex.Message.ToLower().Contains("does not implement icontroller.")) { EventLogProvider.LogException("KMVCDynamicHttpHandler", "ClassControllerNotConfigured", ex, additionalMessage: "Page found, but could not find Page Templates, nor a Controller for " + NewController + ", either create Page Templates for this class or create a controller with an index view to auto handle or modify the KMVCDynamicHttpHandler"); RequestContext.RouteData.Values["Controller"] = "DynamicPageTemplate"; RequestContext.RouteData.Values["Action"] = "NotFound"; controller = factory.CreateController(RequestContext, "DynamicPageTemplate"); controller.Execute(RequestContext); } else { // This will show for any http generated exception, like view errors throw new HttpException(ex.Message, ex); } } catch (InvalidOperationException ex) { if (ex.Message.ToLower().Contains("page template with identifier")) { // This often occurs when there is a page template assigned that is not defined EventLogProvider.LogException("KMVCDynamicHttpHandler", "ClassControllerNotConfigured", ex, additionalMessage: "Page found, but contains a template that is not registered with this application."); RequestContext.RouteData.Values["Controller"] = "DynamicPageTemplate"; RequestContext.RouteData.Values["Action"] = "UnregisteredTemplate"; controller = factory.CreateController(RequestContext, "DynamicPageTemplate"); controller.Execute(RequestContext); } else { throw new InvalidOperationException(ex.Message, ex); } } factory.ReleaseController(controller); }