Лучший способ маршрутизации ASP.NET MVC для не очень распространенных сценариев? - PullRequest
2 голосов
/ 15 января 2009

ОБНОВЛЕНИЕ - 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

Ответы [ 2 ]

2 голосов
/ 16 января 2009

Во-первых, вам не нужен отдел AndTeam2 или отдел AndTeam3. DepartmentAndTeam1 может справиться с этим, потому что он имеет значения по умолчанию для контроллера, действия и идентификатора.

Еще одна вещь, которую я заметил, это то, что ни в одном из ваших примеров URL не указан контроллер. В этом случае оставьте его вне маршрута и просто оставьте его по умолчанию. например,

для URL

http://company.com/department/team/Action/id

используйте маршрут

routes.MapRoute("departmentAndTeam1", "{departmentId}/{teamId}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });

Обратите внимание, что «controller» всегда будет «Home», потому что он никогда не упоминается в URL.

Для действий и URL-адресов, для которых вы не хотите указывать идентификаторы отделов и групп, они должны просто проходить по всем другим маршрутам и просто использовать маршрут по умолчанию. Тот факт, что они не являются, означает, что они попадают на один из более ранних маршрутов. Я думаю, что если вы исправите проблемы с более ранним маршрутом, то это должно решить проблемы с необходимостью дополнительных идентификаторов.

Наконец, если у вас все еще возникают проблемы, попробуйте использовать отладчик маршрутов MVC, как этот, от Фила Хаакеда http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx. Я использовал его для решения проблем с некоторыми из моих маршрутов, и это действительно полезно чтобы увидеть, что он на самом деле делает и во время выполнения.

0 голосов
/ 16 января 2009

Как насчет этого (я не проверял, потому что я не уверен, какие у вас требования, кроме этих 3-х конкретных URL-адресов)?

routes.MapRoute("1", "{department}/{team}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("2", "{department}/{action}/{id}", new { controller = "Home" });
routes.MapRoute("3", "{action}/{id}", new { controller = "Home" });
...