que*_*rin 5 asp.net-mvc routing asp.net-mvc-3
我在寻找匹配路线方面遇到了一些麻烦.
我使用base-32编码的int作为Web应用程序中幻灯片的短链接.每个幻灯片有5个不同版本,我使用首字母来区分每个版本.
路由始终匹配,除非base-32编码的int的第一个字符与指定幻灯片版本的字符相同.所有5个前缀字母都存在此异常:n,f,c,x和h.
前两个字符相同会使这些路线不匹配?我无法理解这里发生了什么(当路线不匹配时,它们只会达到默认值).
路线匹配(/na0):

路线不匹配(/nn0):

路线匹配(/nfg):

路线不匹配(/ffg):

我很难过.这是路由代码,如果在屏幕截图中的RouteDebug表中不清楚:
routes.MapRoute(
"NonBrandedSlideshow",
"n{id}",
MVC.Slideshow.NonBranded(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FullSlideshow",
"f{id}",
MVC.Slideshow.Full(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"CompactSlideshow",
"c{id}",
MVC.Slideshow.Compact(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FlexibleSlideshow",
"x{id}",
MVC.Slideshow.Flexible(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"Html5Slideshow",
"h{id}",
MVC.Slideshow.NonBrandedHtml5(), null,
new { id = Settings.Base32Regex }
);
Run Code Online (Sandbox Code Playgroud)
我在这里应该注意,我使用的是T4MVC(参见第2.2.5节),这些MapRoute方法是T4MVC添加的扩展.MapRoute我使用的方法等同于标准方法,我尝试使用非T4MVC MapRoute方法,结果相同:
routes.MapRoute(
"Html5Slideshow",
"h{id}",
new { controller = "Slideshow", action = "NonBrandedHtml5" },
new { id = Settings.Base32Regex }
);
Run Code Online (Sandbox Code Playgroud)
这是Base32Regex,虽然我已经尝试了它有没有这个约束(我使用的Base32实现将假设I和O是1和0,例如).
public static partial class Settings
{
public static string Base32Regex
{
get { return @"[0-9ABCDEFGHJKMNPQRSTVWXYZ]+"; }
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我也同样困惑。我执行了一些其他测试,据我所知,当路由参数之前的常量具有相同的重复字符时,这一定是检查路由的方式中的一些错误。其他一些令人难以置信的例子:
"nn{id}"
route matches (/nna0)
route doesn't match (/nnn0)
"nnn{id}"
route matches (/nnna0)
route doesn't match (/nnnn0)
Run Code Online (Sandbox Code Playgroud)
一旦我使常量不重复相同的字符,一切都很好
"mn{id}"
route matches (/mna0)
route matches (/mnn0)
route matches (/mnmn)
Run Code Online (Sandbox Code Playgroud)
这可能不正是您正在寻找的。但考虑到情况的奇怪,这是我唯一能想到的办法。将常量添加到约束中并将其从 url 中删除。然后在你的控制器中(这是我不喜欢的部分),你需要从 id 参数中删除该常量。希望这能起作用,或者至少有助于引发另一个解决方案。
routes.MapRoute(
"NonBrandedSlideshow",
"{id}",
MVC.Slideshow.NonBranded(), null,
new { id = "n"+Settings.Base32Regex }
);
Run Code Online (Sandbox Code Playgroud)
更新:
我想这是一个已知问题,谢谢@max-toro