我有一条如下的路线,理想情况下我希望它匹配:
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分开的连字符导致问题。
答案 0 :(得分:6)
作为处理的第一步,路由模块对传入的URL与声明的路由进行模式匹配。这种模式匹配非常渴望(因此 id 将所有连字符都添加到最后一个,这标志着 slug 参数的开始)。约束(如“\ d +”)在模式匹配后运行。所以惹你上去的是,急切的模式匹配是将 id 设置为无效值,然后它使约束失败,这导致整个路线不匹配,因此管道继续尝试匹配传入请求到集合中的下一个路由。
解决此问题的最佳方法(例如最容易理解,非欺骗性)是将整个段作为 idAndSlug 参数进行匹配,然后在控制器中使用正确的正则表达式来拆分此字符串退回到 id 和 slug 成分。
或者,考虑使用斜杠,如mxmissile所示。