Обработка сложных URL-адресов в ASP MVC
-
06-07-2019 - |
Вопрос
Я думаю, у меня есть сложный URL-адрес, с которым нужно иметь дело в ASP MVC 1.0:Все мои действия в большинстве контроллеров постоянно требуют двух параметров:Аккаунт и проект.Это сверх требований каждого действия.Это означает, что типичный URL-адрес выглядит следующим образом:
http://abcd.com/myaccount/projects/project_id/sites/edit/12
В этом примере:мой счет это имя учетной записи. проекты может быть контроллером, другие варианты похожи локации, сотрудники. идентификатор_проекта это идентификатор проекта внутри мой счет, места может быть контроллером, другие варианты похожи персонал или платежи. редактировать это действие и 12 это идентификатор редактируемого сайта.(надеюсь, это достаточно ясно)
Теперь один из вариантов — создать маршрут и передать project_id и учетную запись во все действия контроллеров, добавив ко всем действиям два дополнительных параметра.Это не совсем желательно, и я не уверен, что два контроллера (проекты и сайты) будут здесь работать.
Моя идеальная ситуация — использовать какой-то контекст, который передается вместе с вызовом действия контроллера, и хранить там project_id и myaccount.С остальными параметрами можно работать обычным способом, например:
// sitescontroller
public ActionResult Edit(string id)
{
string account = somecontext["account"];
string project_id = somecontext["project"];
// do stuff
}
Есть идеи, как/где это может произойти?И как это будет работать с ActionLink (т.создание правильных ссылок на основе этого контекста)?
Спасибо!
Решение
Сначала вам нужно добавить токены в свои маршруты, например {company}/projects/{project}{controller}/{action}/{id}
.Тогда, если вы написали свою собственную IControllerFactory, было бы очень легко передать значения из RouteData в контроллер через конструктор или как вы хотите это сделать.Вероятно, самый простой способ начать — создать подкласс DefaultControllerFactory и переопределить метод CreateController.
Другие советы
Для меня это не совсем имеет смысла.Зачем вам маршрут, похожий на следующий:
{controller}/{id}/{controller}/{id}
?