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

时间:2010-04-02 17:35:22

标签: 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+$"}
        );

但是当我点击网址时,我会继续得到这个例外:

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

上述路线虽然符合以下条件:

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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