首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在asp.net mvc这样的asp.net核心中处理seo友好的路由?

如何在asp.net mvc这样的asp.net核心中处理seo友好的路由?
EN

Stack Overflow用户
提问于 2017-11-10 17:51:35
回答 1查看 601关注 0票数 0

我有seo友好的路由在asp.net的mvc基本上广告标题连同id,但在调用它传递id的行动,但显示标题+ id的网址。

下面是代码。

代码语言:javascript
复制
 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核心中获得相同的功能。

EN

回答 1

Stack Overflow用户

发布于 2017-11-18 22:53:28

这就是解决方案,我自己找到的

代码语言:javascript
复制
    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" });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47219941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档