我有一条如下所示的路线,理想情况下我希望它匹配:
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.Web.Mvc.ActionResult Index(Int32)”的不可空类型“System.Int32”的参数“id”的空条目。
上面的路线将匹配以下内容:
domain.com/layout/1-slug 或 domain.com/layout/1-slug_permalink
似乎将 ID 与 Slug 分开的连字符引起了问题。
作为处理的第一步,路由模块根据声明的路由执行传入 URL 的模式匹配。这种模式匹配是急切的(所以id将所有连字符添加到最后一个连字符,这标志着整个连字符的开始slug范围)。约束(如“\d+”)在模式匹配后运行。所以让你困惑的是急切的模式匹配正在设置id为无效值,则它会导致约束失败,从而导致整体路由不匹配,因此管道继续尝试将传入请求与集合中的下一个路由匹配。
解决此问题的最佳(例如,最容易理解、非欺骗)方法是将整个段匹配为id和slug参数,然后在控制器中使用正确的正则表达式将该字符串拆分回其id and slug成分。
或者,考虑使用斜杠,如 mxmissile 建议的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)