Объединение значений в ASP.Net Routes для MVC - PullRequest
0 голосов
/ 04 января 2012

Может кто-нибудь предложить способ сделать следующее в ASP.Net Routing (для MVC 3)?

Я хочу иметь URL-адреса, где значение, которое определяет контроллер, фактически является частью идентификатора страницы:

/{id}-{controller}/{action}/{further-values}

Но мне нужно, чтобы значение id включало также значение, используемое для контроллера, поэтому в приведенном выше примере, если у нас есть следующий URL:

/chelsea-football-team/view/2010-2011

Я хочу, чтобы значение {id} в идеале было "chelsea-football-team", контроллером - "football-team", действием - "view" и дополнительным значением - "2010-2011 ».

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

Я знаю, что могу просто объединить значения в контроллере, но это добавляет много дополнительного, повторяющегося кода - так что это выполнимо любым другим способом?

Почему я хочу это сделать? Потому что мне нужно полное название команды, но часть имени команды всегда будет соответствовать имени контроллера, так почему бы не объединить их в маршруте?

1 Ответ

1 голос
/ 04 января 2012

Я хочу, чтобы значением {id} в идеале было «chelsea-football-team», контроллером - «football-team», действием - «view» и дополнительным значением - «2010-2011»".

...MapRoute(null, "{id}/{action}/{*furtherValues}", 
        new {
            controller = "FootballTeam",
        });

Обновление после комментария 1

Невозможно объединить параметры маршрута в URL, чтобы один параметр представлял как переменную (id), так иконтроллер, использующий стандартную реализацию маршрутизации.Если вы хотите, чтобы id был "chelsea-football-team", это должен быть автономный параметр маршрута.Вы не можете комбинировать его таким образом, чтобы MVC извлекал имя контроллера из идентификатора.

Чтобы удовлетворить этому требованию, вам может потребоваться создать собственную реализацию RouteBase:

public class MyCustomRoutingPattern : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // do your coding and return an instance of RouteData
    }
}

Выбудет использовать его следующим образом:

routes.Add(new MyCustomRoutingPattern(
    "{id}/{action}/{*furtherValues}"));

Ваша реализация RouteBase может затем извлечь контроллер из параметра id.В книге Pro ASP.NET MVC3 Framework Стива Сандерсона и Адама Фримена есть раздел о том, как переопределить класс RouteBase.

...