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

голоса
2

UPDATE - 1/21/09:

Единственный способ , которым я был в состоянии получить эту работу умеренно, чтобы создать маршруты , которые имеют дополнительные данные пути ... Другими словами , вместо http://company.com/myDepartment/myTeam/action/id , маршруты необходимо должны быть построены для обработки путей , как http://company.com/department/myDepartment/team/myTeam и так далее.

END UPDATE - 1/21/09:

У меня есть два возможного соглашение URL, что мне нужно, чтобы иметь возможность направлять на одни и те же контроллеры / просмотры

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

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

http://company.com/Action/id

Выше был довольно прост в обращении, так как псевдонимы отдела / группы в имя хоста Ури.

Однако, когда я хочу реализовать следующее, я не смог получить его работу удовлетворительно:

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 маршрута?

Примечание: Это замена устаревшего приложения и форматы URL должны быть сохранены / поддерживается.

EDIT: Во- первых, спасибо за ответы до сих пор. На основе ответов , которые я получил , я думаю , что я не был достаточно ясно , на какой -то момент. Это (свободно) , что мой контроллер выглядит следующим образом :

public class ControllerBase : Controller
{
    DepartmentDTO department;
    TeamDTO team;
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        PopulateDept(filterContext.ActionParameters(departmentId);
        PopulateTeam(filterContext.ActionParameters(teamId);
    }
}

Однако, с этой схемой, все контроллеры, которые наследуют от этого класса (и направляются соответственно с маршрутами, перечисленных выше) ожидают (что я воспринимаю как избыточные / uneeded) параметры в своих обработчиков действий. Я хочу, чтобы избежать необходимости каждый обработчика требовать, чтобы эти «лишних» параметров и ищет предложение.

Благодаря! -Giorgio

Задан 15/01/2009 в 19:48
источник пользователем
На других языках...                            


2 ответов

голоса
2

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

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

для URL

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

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

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

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

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

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

Ответил 16/01/2009 в 01:54
источник пользователем

голоса
0

Как об этом (я не проверял, потому что я не знаю, какие требования у вас есть другие, чем те отображения 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" });
Ответил 16/01/2009 в 02:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more