使用{ID} - {Slug}格式的ASP.NET MVC路由约束

Tim*_*ung 3 asp.net asp.net-mvc routes

我有一条如下的路线,理想情况下我希望它匹配:

domain.com/layout/1-slug-is-the-name-of-the-page

        routes.MapRoute(
            "Layout",                                                // Route name
            "layout/{id}-{slug}",                                           // URL with parameters
            new { controller = "Home", action = "Index"}, new {id = @"\d+$"}
        );
Run Code Online (Sandbox Code Playgroud)

但是当我点击网址时,我会继续获得此异常:

参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于方法'System.Web.Mvc.ActionResult Index(Int32)'....

以上路线将匹配以下内容:

domain.com/layout/1-slug或domain.com/layout/1-slug_permalink

似乎将ID与Slug分开的连字符导致问题.

Lev*_*evi 6

作为处理的第一步,路由模块执行传入URL与声明的路由的模式匹配.这种模式匹配非常渴望(因此id将所有连字符都连到最后一个,这标志着slug参数的开始).约束(如"\ d +")在模式匹配后运行.那么绊倒的是,急切的模式匹配是将id设置为无效值,然后它使约束失败,这导致整个路由不匹配,因此管道继续尝试将传入请求与下一个路由匹配集合.

解决此问题的最佳方法(例如最容易理解,非欺骗)方法是将整个段作为idAndSlug参数进行匹配,然后在控制器中使用正确的正则表达式将此字符串拆分为其idslug成分.

或者,考虑使用斜杠,如mxmissile所示.