Как мы можем создать маршрут, который будет определять, что 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 / Widgets / 25246810-4b60-4db8-8567-8db8826, который выглядит правильно, но это не так (в данном руководстве только 28 символов).
Поскольку URL не соответствовал маршруту, ответ был 404. Но это обманчиво и вызвало проблему отладки: похоже, действие Widgets / Item возвращает 404. И мы потратили часы, пытаясь выяснить, что не так с этим действием, когда на самом деле действие даже не было вызвано Только когда я установил RouteDebugger, я заметил, что гид был искажен.
Как мы можем создать еще один маршрут ошибки, который обнаружит, что 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 и т. Д. (И у меня довольно много маршрутов). Нет ли более общего способа сделать это?