【问题标题】:The constraint reference 'slugify' could not be resolved to a type约束引用“slugify”无法解析为类型
【发布时间】:2018-10-22 04:28:03
【问题描述】:

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:创建名为“default”和模板“{controller:slugify}/{action:slugify}/{id?}”的路由时出错。

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

【问题讨论】:

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


    【解决方案1】:

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 2017-09-30
      • 2017-11-28
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      相关资源
      最近更新 更多