2012-01-04 4 views
0

Может ли кто-нибудь предложить способ выполнения следующих задач в ASP.Net Routing (для MVC 3)?Объединение значений в ASP.Net Маршруты для MVC

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

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

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

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

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

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

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

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

+0

Не следует '{далее-значения}' быть '{* furtherValues}'? Так как вы не можете создать переносимый аргумент в своем методе действий? – danludwig

+0

Его просто общее представление о том, что Im после, а не фактически рабочий код. – Moo

ответ

1

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

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

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

Вы не можете комбинировать параметры маршрута в URL таким образом, что один параметр представляет собой как переменную (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.

+0

Нет, потому что это ограничивает меня одним контроллером, когда мне требуется возможность определить или намекнуть на контроллер, используемый в URL-адресе. Спасибо за ответ tho :) – Moo

Смежные вопросы