ОБНОВЛЕНИЕ - 21.01.09:
Единственный способ, которым я смог получить эту работу достаточно хорошо, - это создать маршруты, которые имеют дополнительную информацию о пути ... другими словами, вместо http://company.com/myDepartment/myTeam/action/id, маршруты должны быть построены так, чтобы обрабатывать пути
как http://company.com/department/myDepartment/team/myTeam и т. д.
КОНЕЦ ОБНОВЛЕНИЯ - 21.01.09:
У меня есть два возможных соглашения об URL-адресах, которые необходимо использовать для маршрутизации на одни и те же контроллеры / представления
http://team.department.company.com/Action/id
http://department.company.com/Action/id
http://company.com/Action/id
С вышесказанным было довольно легко справиться, поскольку псевдонимы отделов / команд находятся в имени хоста Uri.
Однако, когда я хочу реализовать следующее, я не смог заставить его работать удовлетворительно:
http://company.com/department/team/Action/id
http://company.com/department/Action/id
http://company.com/Action/id
Вот маршруты, которые я определил:
routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
routes.MapRoute("departmentAndTeam2", "{departmentId}/{teamId}/{controller}/{action}", new { controller = "Home", action = "Index" });
routes.MapRoute("departmentAndTeam3", "{departmentId}/{teamId}/{controller}", new { controller = "Home", action = "Index" });
routes.MapRoute("department", "{department}/{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = ""});
routes.MapRoute("departmentAndTeam4", "{departmentId}/{teamId}/", new { controller = "Home", action = "Index"});
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
Проблема, с которой я столкнулся, заключается в том, что теперь каждый метод действия в моих контроллерах требует параметр DepartmentId & teamId. Я действительно предпочел бы просто иметь возможность «предварительно обработать» значения идентификатора отдела / команды в базовом классе контроллера, который есть в обработчике события OnActionExecuting. Я лаю не на том дереве? Нужно ли мне реализовывать свой собственный обработчик Mvc Route?
Примечание. Это заменяет устаревшее приложение, и необходимо сохранять / поддерживать форматы URL.
РЕДАКТИРОВАТЬ: Во-первых, спасибо за ответы до сих пор. Судя по полученным ответам, мне кажется, что я недостаточно четко понял один момент. Вот (слабо) как выглядит мой контроллер:
public class ControllerBase : Controller
{
DepartmentDTO department;
TeamDTO team;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
PopulateDept(filterContext.ActionParameters("departmentId");
PopulateTeam(filterContext.ActionParameters("teamId");
}
}
Однако в этой схеме все контроллеры, которые наследуются от этого класса (и маршрутизируются соответствующим образом с маршрутами, перечисленными выше), ожидают (что я считаю избыточными / ненужными) параметров в своих обработчиках действий. Я хочу, чтобы каждый обработчик не требовал этих «лишних» параметров и ищу предложения.
Спасибо!
-Giorgio