2

ASP.NET Core 2.2 引入了一个使用参数转换器抑制路由 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:创建名为“default”和模板“{controller:slugify}/{action:slugify}/{id?}”的路由时出错。

可能是我错过了更多!请提供任何帮助!

4

1 回答 1

5

正如 ASP.NET Core文档所说,我必须Parameter transformer使用ConstraintMap进行配置。所以我做了如下工作:

方法中的路由配置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();
        }
    }

谢谢你。

于 2018-10-22T04:35:51.093 回答