Что касается вашего второго вопроса (т. Е. «Глубокая маршрутизация»), вы можете справиться с этим в своем контроллере вместо добавления реальных маршрутов.Каждая часть URL доступна через коллекцию RouteData.Values
внутри действия вашего контроллера.Таким образом, ваш маршрут может выглядеть следующим образом:
~/Store/Products/Category/{*params}
Если предположить типичную конфигурацию маршрута, это вызовет метод действия Category(...)
для ~/areas/store/controllers/storeController
, который может затем захватить delivery
и uk
из RouteData.Values
collection.
Есть много других подходов к этому - сохранение маршрутов в базе данных и использование связанных метаданных для поиска правильного контроллера и метода - но я думаю, что это самый простой.Кроме того, это может быть очевидно, но если в вашем примере вам действительно нужны только два параметра, помимо «Категория», вы можете просто использовать
public ActionResult Category(string category, string region)
{
...
}
и маршрут:
~/store/{controller}/{action}/{category}/{region}/{*params}
Delivery
и UK
будут сопоставлены с параметрами категории и региона, соответственно.Все, что находится за пределами uk
, все еще будет доступно через коллекцию RouteData.Values.Это предполагает, что у вас нет более конкретных маршрутов, таких как
~/store/{controller}/{action}/{category}/{region}/{foo}/{bar}/{long_url}/{etc}
, которые были бы более подходящими.({* params} может конфликтовать со вторым маршрутом; вам придется выяснить, не является ли это проблемой.)
Для вашего первого вопроса:
Вы можете динамически генерировать источник представленияи вернуть его как строку из контроллера, избавляя от необходимости передавать много вещей через ViewBag.Если виртуальная страница из вашей базы данных CMS требует включения частичных представлений, вы должны добавить ссылки на эти компоненты при создании страницы.(Это может или не может решить вашу проблему - если нет, пожалуйста, предоставьте больше информации.)