Webforms 4 URL маршрутизации множественного соответствия
У меня есть проект webforms 4, и я использую URL-маршрутизацию
В определенных случаях данный маршрут будет соответствовать более чем одному шаблону.
Кажется, механизм маршрутизации пробует каждый шаблон в определенном порядке и останавливается при первом совпадении. (поправьте меня, если я ошибаюсь). Если ресурс (в основном файл aspx) для выбранного шаблона не существует, у нас возникает ошибка 404 (ресурс не существует).
Следующий соответствующий шаблон сопоставляется с существующим ресурсом, но механизм этого не пытается.
Пример (с использованием соглашений об именовании, аналогичных MVC)
routes.MapPageRoute("Action", "{controler}/{action}/{*pathInfo}", "~/Views/{controler}/{action}.aspx");
routes.MapPageRoute("Overview", "{controler}/{*pathInfo}", "~/Views/{controler}/Overview.aspx");
Таким образом, в файловой системе есть /Views/Patient/Overview.aspx и /Views/Patient/Search.aspx.
Маршрут " / Patient " будет соответствовать второму шаблону и сопоставлен с " /Views/Patient/Overview.aspx "
Маршрут " / Patient / Search " будет соответствовать первому шаблону и отображаться в " /Views/Patient/Search.aspx "
Маршрут " / Patient / Search / SomePathInfo " будет соответствовать первому шаблону и сопоставляться с " /Views/Patient/Search.aspx " (обрабатывая часть URL "SomePathInfo" как часть {*panthinfo})
Теперь проблема в том, что маршрут " / Patient / SomePathInfo " соответствует обоим шаблонам. Первый обрабатывает "SomePathInfo" как часть {action} (поиск " /Views/Patient/SomePathInfo.aspx ", который не существует). Второй будет рассматривать "SomePathInfo" как часть {*pathInfo} и отображать в существующий " /Views/Patient/Overview.aspx ".
Механизм пробует первый, хотя, он не может найти файл SomePathInfo.aspx и выдает ошибку 404.
Мой вопрос: есть ли способ направить механизм, чтобы попробовать каждый шаблон, пока он не найдет существующий ресурс? (Или, в более общем смысле , пока не будет выполнено какое-то условие? [Здесь: resource.exists])!
1 ответ
Обходное решение для моей проблемы, описанной выше, заключается в использовании ограничений маршрутизации и определении ограниченного набора доступных значений для заполнителя {action}. То же самое относится к заполнителю {controller} и т. Д.
Поэтому я определяю ограничение для принятия только действий в списке: "индекс", "детали", "добавить", "редактировать", "выбрать" и т. Д., А также контроллеров в списке "дом", "пациент", "инцидент". так далее;
routes.MapPageRoute("Action", "{controler}/{action}/{*queryValues}", "~/Views/{controler}/{action}.aspx", true,
new RouteValueDictionary { // Default values
{ "controller", "home"},
{ "action", "index"} },
new RouteValueDictionary { // constraints
{ "controller", "home|patient|incident"},
{ "action", "index|details|add|delete|edit|select"} });
Таким образом, когда я ввожу что-то вроде "Patient/ Somequery", строка "Somequery" не удовлетворяет ограничению этого отображения, поэтому механизм переходит к следующему и обрабатывает часть "Somequery" как {*queryvalues} и не {действие}.
Но вопрос все еще остается в силе:
" Есть ли способ указать механизму пробовать каждый шаблон, пока он не найдет существующий ресурс? (Или, в более общем смысле , пока не будет выполнено какое-либо условие? [Здесь: resource.exists] "