针对拼写错误的URL的ASP.NET MVC路由处理?

时间:2012-02-23 01:52:45

标签: c# asp.net-mvc asp.net-mvc-routing

我们如何创建一条路由来检测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等(我有很多路线)。是不是有更通用的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

当我在路由中处理guid时,我会接受一个字符串,尝试将字符串值解析为guid,如果它没有解析,我会返回一个不同的视图,并显示一条消息,表明该ID是无效并重试

你唯一需要改变的就是删除路由约束并将你的Action改为接受字符串而不是guid(除非你的动作已经接受了一个字符串)

答案 1 :(得分:0)

最简单的解决方案是删除路由约束,然后检查控制器中的空参数,并从该点做任何你想做的事。