我们如何创建一条路由来检测URL是否与路由匹配,但该路由的参数是错误的?
我最近有几个案例,用户输错了URL并且很难调试,因为路由表不能非常优雅地处理这些拼写错误:
此路由处理URL / Widgets / guid
routes.MapRestfulRoute(
"WidgetsItem",
"Widgets/{idString}",
new { controller = "Widgets", action = "Item" },
new { idString =
@"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$"}
);
routes.MapRoute("WidgetsList", "Widgets", new { controller = "Widgets", action = "List" });
routes.MapRestfulRoute("CatchAll","{*url}", new {controller = "Error", action = "Http404"});
并且用户输入了URL / Widgets / 25246810-4b60-4db8-8567-8db8826,它看起来正确但不是(提供的guid中只有28个字符)。
因为URL与路由不匹配,所以响应是404.但这是欺骗性的并且导致调试问题:看起来Widgets / Item操作返回404.我们花了好几个小时试图找出什么是这个动作是错误的,实际上甚至没有调用动作。直到我安装了RouteDebugger,我才注意到guid是畸形的。
我们如何创建另一个错误路由来检测URL确实与路由匹配,但该路由的参数是错误的?
编辑:我可以通过添加匹配/ Widgets /任何东西的新路线来“修复”它,并将该路线放在正常路线之后:
routes.MapRestfulRoute(
"WidgetsItemError",
"Widgets/{idString}",
new { controller = "Widgets", action = "Item" },
new { idString = @"^.+$" } // match if it has any param at all
);
但这似乎效率很低 - 我必须为每一条路线添加类似的错误路线,例如/ Foo,/ Bar / FooBar等(我有很多路线)。是不是有更通用的方法来做到这一点?
答案 0 :(得分:2)
当我在路由中处理guid时,我会接受一个字符串,尝试将字符串值解析为guid,如果它没有解析,我会返回一个不同的视图,并显示一条消息,表明该ID是无效并重试
你唯一需要改变的就是删除路由约束并将你的Action改为接受字符串而不是guid(除非你的动作已经接受了一个字符串)
答案 1 :(得分:0)
最简单的解决方案是删除路由约束,然后检查控制器中的空参数,并从该点做任何你想做的事。