约束引用“ slugify”无法解析为类型

时间:2018-10-22 04:28:04

标签: asp.net-core asp.net-core-routing asp.net-core-2.2

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?}”的路由时发生错误。

可能是我还缺少什么!请帮忙!

1 个答案:

答案 0 :(得分:4)

正如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();
        }
    }

谢谢。