Beispiel #1
0
        public virtual RouteData GetMatchingRoute(IRouter router, RouteContext routeContext)
        {
            if (DynamicRoutes == null)
            {
                return(null);
            }
            var requestPath = routeContext.HttpContext.Request.Path.Value.TrimEnd('/');

            foreach (var dr in DynamicRoutes.OrderBy(x => x.Order))
            {
                var routeData    = dr;
                var parsedTokens = _routeTemplateParser.ParsePathForTemplate(requestPath, routeData.Template);
                if (!parsedTokens.Any())
                {
                    continue;
                }
                parsedTokens.TryGetValue("SeName", out string seName);
                parsedTokens.TryGetValue("Id", out string id);
                if (seName.IsNullEmptyOrWhiteSpace() && id.IsNullEmptyOrWhiteSpace())
                {
                    continue;
                }

                var entityName = routeData.SeoEntityName;
                if (!id.IsNullEmptyOrWhiteSpace())
                {
                    var idAsInt = int.Parse(id);
                    var seoMeta =
                        _seoMetaService.FirstOrDefault(x => x.EntityName == entityName && x.Slug == seName &&
                                                       x.EntityId == idAsInt);
                    if (seoMeta == null)
                    {
                        continue;
                    }
                    //preserve seometa so we can serve it later
                    routeContext.HttpContext.SetRequestSeoMeta(seoMeta);
                    routeContext.RouteData.Values["id"]         = id;
                    routeContext.RouteData.Values["controller"] = routeData.ControllerName;
                    routeContext.RouteData.Values["action"]     = routeData.ActionName;
                    return(routeData);
                }
                //if we are here, id was not passed, so we'll have to check all the available slugs for entitytype
                var matchingSeoMetas = _seoMetaService.Get(x => x.EntityName == entityName && x.Slug == seName).ToList();
                foreach (var seoMeta in matchingSeoMetas)
                {
                    //set id so we can generate correct reverse path for validation
                    routeContext.RouteData.Values["id"] = seoMeta.EntityId;
                    //check if the request path is correct
                    var vpd = GetVirtualPathData(router,
                                                 new VirtualPathContext(ApplicationEngine.CurrentHttpContext, routeContext.RouteData.Values, routeContext.RouteData.Values, routeData.RouteName));
                    var url = vpd.VirtualPath;
                    if (requestPath != url)
                    {
                        continue;
                    }
                    routeContext.RouteData.Values["controller"]            = routeData.ControllerName;
                    routeContext.RouteData.Values["action"]                = routeData.ActionName;
                    routeContext.RouteData.Values[routeData.ParameterName] = seoMeta.EntityId;
                    //preserve seometa so we can serve it later
                    routeContext.HttpContext.SetRequestSeoMeta(seoMeta);

                    return(routeData);
                }
            }
            return(null);
        }