我们如何创建一个能够检测到URL匹配路由但是该路由参数错误的路由?ASP.NET MVC路由处理拼写错误的URL?
我已经有几起案件最近在用户已经输错一个URL,它已经很难调试,因为路由表中没有处理这些拼写错误很优雅:
这条路线处理URL /小工具/ 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 /小工具/ 25246810-4b60-4db8-8567-8db8826看起来正确的,但不是(有28只在提供了GUID字符)。
由于URL与路由不匹配,响应为404.但这是欺骗性的,并导致了一个调试问题:它看起来像Widgets/Item操作返回了404。我们花了几个小时试图找出什么这个行为是错误的,事实上这个行为甚至没有被调用。直到我安装了RouteDebugger,我才注意到该GUID格式不正确。
我们如何可以创建将检测到的网址不符合实际的路线,但该参数,以这条路线是错误的另一条错误的路线?
编辑:我可以通过添加匹配/小工具/任何一个新的途径,并把该航线的正常路线后,“固定”它:
routes.MapRestfulRoute(
"WidgetsItemError",
"Widgets/{idString}",
new { controller = "Widgets", action = "Item" },
new { idString = @"^.+$" } // match if it has any param at all
);
但是,这似乎是非常低效的 - 我会必须为每条路线添加一条类似的错误路线,例如/ Foo,/ Bar/FooBar等等(并且我有很多路线)。没有更通用的方法来做到这一点?
请注意,路由约束可能会伤害您的应用程序性能。 – Paul 2012-02-23 03:30:45
你有任何讨论的链接来支持这个吗?你将如何创建一个没有约束的路由,然后仍然能够区分/ Widgets/guid(返回一个项目)和/ Widgets(返回列表) – 2012-02-23 07:58:32
为什么你要让用户手动输入一个GUID?这很容易出错。 – RickAndMSFT 2012-02-23 19:40:42