ASP.NET Core 2.2引入了一个使用Parameter transformer来细化路由URL的选项,如下所示:
routes.MapRoute(
name: "default",
template: "{controller=Home:slugify}/{action=Index:slugify}/{id?}");
我做了如下相同的事情:
routes.MapRoute(
name: "default",
template: "{controller:slugify}/{action:slugify}/{id?}",
defaults: new { controller = "Home", action = "Index" });
我在
ConfigureServices
方法中的路由配置如下:services.AddRouting(option =>
{
option.LowercaseUrls = true;
});
但出现以下错误:
InvalidOperationException:约束引用'slugify'无法解析为类型。向“ Microsoft.AspNetCore.Routing.RouteOptions.ConstraintMap”注册约束类型。
和
RouteCreationException:创建名称为“默认”且模板为“ {controller:slugify} / {action:slugify} / {id?}”的路由时发生错误。
可能是我错过了更多!请帮忙!
最佳答案
正如ASP.NET Core Documentation所说,我必须使用ConstraintMap配置Parameter transformer
。所以我做了如下工作:ConfigureServices
方法中的路由配置应如下所示:
services.AddRouting(option =>
{
option.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
option.LowercaseUrls = true;
});
然后
SlugifyParameterTransformer
如下:public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
public string TransformOutbound(object value)
{
// Slugify value
return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
}
}
谢谢。