Я хотел бы добиться чего-то очень похожего на этот вопрос , с некоторыми улучшениями.
Есть веб-приложение 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
классом
Я также нашел этот вопрос , также этот и этот , но они не очень помогли, так как не дают объяснения о моих первых двух пунктах.
Я вижу следующие возможные решения:
- Отображение маршрута для каждой страницы индивидуально.
Для этого требуется, чтобы я прошел по всему дереву при запуске приложения и добавил маршрут с точным соответствием в конец таблицы маршрутов. - Я мог бы добавитьмаршрут с
{*path}
и написать пользовательский IRouteHandler
, который его обрабатывает, но я не вижу, как я мог тогда справиться с первыми двумя правилами, так как этот обработчик мог бы обрабатывать все.
Пока что первое решение кажется правильным, потому что оно также самое простое.Но, тем не менее, даже в этом случае я не уверен, как можно заставить PageController
обрабатывать запросы.
Буду очень признателен за ваши мысли по этому поводу.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Теперь у меня было время изучить все аспекты каждого ответа, который я получил.Я принял ответ Нила, так как он дает лучшее объяснение того, как все работает.Я также проголосовал за все остальные ответы, так как они дают хорошие идеи.