Я хотел бы добиться чего-то очень похожего на этот вопрос, с некоторыми улучшениями.
Есть веб-приложение ASP.NET MVC.
У меня есть дерево сущностей.
Например, класс Page
, у которого есть свойство Children, которое имеет тип IList<Page>
. (Экземпляр класса Page
соответствует строке в базе данных.)
Обратите внимание, что владельцы сайта могут добавить новую страницу в любое время или удалить существующие, и URL-адреса также должны отражать эти изменения.
Я хотел бы назначить уникальный URL-адрес каждому Page
в базе данных.
Я обрабатываю объекты Page
с помощью контроллера с именем PageController
.
Примеры URL:
http://mysite.com/Page1/
http://mysite.com/Page1/SubPage/
http://mysite.com/Page/ChildPage/GrandChildPage/
Вы видите картинку.
Итак, я бы хотел, чтобы каждый объект Page
имел свой собственный URL-адрес, равный URL-адресу его родительского элемента, плюс собственное имя.
В дополнение к этому, я также хотел бы иметь возможность сопоставить одиночный Page
с /
(корневым) URL.
Я хочу применить эти правила:
- Если URL-адрес может быть обработан с помощью любого другого маршрута или файл существует в файловой системе по указанному URL-адресу, разрешить сопоставление URL-адресов по умолчанию.
- Если URL-адрес может быть обработан поставщиком виртуального пути, позвольте ему обработать его.
- Если другого нет, сопоставьте остальные URL-адреса с классом
PageController
.
Я также нашел этот вопрос и также этот и this one, но они не сильно помогли, поскольку не дают объяснения по поводу моих первых двух пунктов.
Я вижу следующие возможные варианты:
- Сопоставьте маршрут для каждой страницы по отдельности.
Это требует, чтобы я прошел по всему дереву при запуске приложения и добавил маршрут с точным соответствием в конец таблицы маршрутов. - Я мог бы добавить маршрут с помощью
{*path}
и написать собственныйIRouteHandler
, который его обрабатывает, но я не понимаю, как я могу справиться с первыми двумя правилами тогда, поскольку этот обработчик должен обрабатывать все.
Пока что первое решение кажется правильным, потому что оно также является самым простым. Но все же даже в этом случае я не уверен, как я могу заставить PageController
обрабатывать запросы.
Я был бы очень признателен за ваши мысли по этому поводу.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Теперь у меня было время изучить все аспекты каждого полученного ответа. Я принял ответ Нила, так как он лучше всех объясняет, как все работает. Я также поддержал все остальные ответы, поскольку они дают хорошие идеи.