Как реализовать динамическую маршрутизацию с выбранным форматом URL?

Мое требование к URL-адресу: countryname/statename/cityname. Для этого я пишу свой собственный RouteHandler и добавляю один новый маршрут в routecollection вот так:

routes.Add(new Route("{*data}",
           new RouteValueDictionary(new
               {
                 controller = "Location",
                 action = "GetLocations"
               }),
           new MyRoutehandler()));

Теперь мой вопрос: как мне создать этот тип URL?

Я попробовал Html.ActionLink(), но он запрашивает имя действия и имя контроллера. Однако в моем формате URL у меня нет имени действия или имени контроллера. Как мне это решить?


person vecsuresh    schedule 14.04.2009    source источник


Ответы (1)


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

routes.MapRoute("LocationRoute",
                "{countryname}/{statename}/{cityname}", 
                new { controller = "Location", action = "GetLocations" });

Это может конфликтовать с маршрутом по умолчанию "{controller}/{action}/{id}", но это в любом случае произойдет с вашей текущей системой (если только вы не создадите собственный Route, наследующий от System.Web.Routing.RouteBase, а не чем пользовательский обработчик маршрутов). Обработчик маршрута предназначен для управления действиями ПОСЛЕ извлечения данных маршрута. Поскольку вы все еще используете Controller и Action, вы все равно сможете использовать файл MvcRouteHandler. Если вы хотите настроить способ извлечения данных о маршруте, возможно, вам понадобится собственный маршрут.

Кстати, если вы хотите использовать маршрут, который не включает имена контроллеров и действий, используйте Html.RouteLink. ActionLink — это просто оболочка, которая помещает контроллер и действие в RouteValuesDictionary и вызывает тот же внутренний помощник, что и RouteLink.

Хотя в этом случае у маршрута по-прежнему есть Controller и Action ("Location" и "GetLocations"), так что вы все равно можете использовать ActionLink. Я думаю, что ActionLink позволяет вам указать имя маршрута, поэтому, если вы дадите своему маршруту имя, вы можете указать это имя в ActionLink, и он будет использовать этот маршрут для создания URL-адреса (я могу ошибаться в этом и если это так, вы все равно можете использовать RouteLink и вручную добавить значения контроллера и маршрута действия)

person Andrew Stanton-Nurse    schedule 14.04.2009