我有seo友好的路由在asp.net的mvc基本上广告标题连同id,但在调用它传递id的行动,但显示标题+ 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核心中获得相同的功能。
发布于 2017-11-18 22:53:28
这就是解决方案,我自己找到的
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" });https://stackoverflow.com/questions/47219941
复制相似问题