Обработка маршрута ASP.NET MVC для URL с ошибками? - PullRequest
1 голос
/ 23 февраля 2012

Как мы можем создать маршрут, который будет определять, что 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 и т. Д. (И у меня довольно много маршрутов). Нет ли более общего способа сделать это?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Когда я имел дело с guid в моих маршрутах, я принимал строку, пытался разобрать строковое значение для guid, если он не анализировался, я возвращал другое представление с сообщением, указывающим, что id былнедопустимый и попытаться снова

Единственное, что вам нужно изменить здесь, это удалить ограничение маршрута и изменить свое действие, чтобы принимать строку вместо guid (если ваше действие уже не принимает строку)

0 голосов
/ 23 февраля 2012

Самое простое решение - удалить ограничение маршрута, затем проверить нулевой параметр в вашем контроллере и делать все, что вы хотите с этой точки.

...