簡體   English   中英

如何在asp.net mvc等asp.net核心中處理seo友好路由?

[英]How to handle seo friendly routing in asp.net core like asp.net mvc?

我在asp.net mvc中具有seo友好路由,該路由基本上將標題和ID一起廣告,但是在調用時它將id傳遞給動作,但在URL中顯示title + id。

這是代碼。

 routes.Add("ClinicDetails", new SeoFriendlyRoute("veterinary-clinics/{id}/details",
                new RouteValueDictionary(new { controller = "clinics", action = "details" }),
                new MvcRouteHandler()));


public class SeoFriendlyRoute : Route
    {
        public SeoFriendlyRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler)
        {
        }
        public SeoFriendlyRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler, IEnumerable namespaces) : base(url, defaults, routeHandler)
        {
            DataTokens = defaults;
            defaults["Namespaces"] = namespaces;
        }
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            var routeData = base.GetRouteData(httpContext);
            if (routeData == null) return null;
            if (routeData.Values.ContainsKey("id"))
                routeData.Values["id"] = GetIdValue(routeData.Values["id"]);
            return routeData;
        }
        private object GetIdValue(object id)
        {
            if (id == null) return null;
            var idValue = id.ToString();
            var regex = new Regex(@"^[\w|\W]+-(?<id>\d+).*$");
            var match = regex.Match(idValue);
            return match.Success ? match.Groups["id"].Value : id;
        }
    }

我如何在asp.net核心中獲得相同的功能。

這是解決方案,我自己找到了

    public static class RouteExtensions
        {
            public static IRouteBuilder MapSeoFriendlyRoute(this IRouteBuilder routeBuilder, string name,
                string template, object defaults)
            {
                var inlineConstraintResolver = (IInlineConstraintResolver)routeBuilder
                    .ServiceProvider
                    .GetService(typeof(IInlineConstraintResolver));

                var defaultsDictionary = new RouteValueDictionary(defaults);
                routeBuilder.Routes.Add(new SeoFriendlyRoute(routeBuilder.DefaultHandler,
                name,
                template,
                defaultsDictionary,
                constraints: null,
                dataTokens: null,
                inlineConstraintResolver: inlineConstraintResolver));
                return routeBuilder;
            }
        }


        public class SeoFriendlyRoute : Route
        {
            public SeoFriendlyRoute(IRouter target, string routeTemplate, IInlineConstraintResolver inlineConstraintResolver) : base(target, routeTemplate, inlineConstraintResolver)
            {
            }

            public SeoFriendlyRoute(IRouter target, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) : base(target, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver)
            {
            }

            public SeoFriendlyRoute(IRouter target, string routeName, string routeTemplate, RouteValueDictionary defaults, IDictionary<string, object> constraints, RouteValueDictionary dataTokens, IInlineConstraintResolver inlineConstraintResolver) : base(target, routeName, routeTemplate, defaults, constraints, dataTokens, inlineConstraintResolver)
            {
            }

            protected override Task OnRouteMatched(RouteContext context)
            {
                var routeData = context.RouteData;
                if (routeData != null)
                {
                    if (routeData.Values.ContainsKey("id"))
                        routeData.Values["id"] = GetIdValue(routeData.Values["id"]);
                }
                return base.OnRouteMatched(context);
            }

            public override Task RouteAsync(RouteContext context)
            {
                return base.RouteAsync(context);
            }

            private object GetIdValue(object id)
            {
                if (id == null) return null;
                var idValue = id.ToString();
                var regex = new Regex(@"^[\w|\W]+-(?<id>\d+).*$");
                var match = regex.Match(idValue);
                return match.Success ? match.Groups["id"].Value : id;
            }
        }

routes.MapSeoFriendlyRoute("AdDetails", "ads/{id}/details",
                defaults: new { controller = "ads", action = "details" });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM