Понимание и настройка маршрутов - PullRequest
1 голос
/ 03 августа 2011

У меня есть приложение MVC, маршрут которого по умолчанию указан следующим образом:

routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
            )

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

Учитывая следующее, я хотел иметь возможность вызывать индекс контроллера ApplicationModule без необходимости конкретно упоминать метод индекса в URL-адресе, так же, как я делаю для других контроллеров:

href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"

Если я удалю / Index из этого URL, приложение сообщит мне, что указанный ресурс не найден. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Понимание механизма маршрутизации требует практики и опыта.Идея механизма маршрутизации заключается в том, чтобы взять входящий URL-адрес и получить объект обработчика (IHttpHandler), который будет обрабатывать запрос.Что касается вашего вопроса, первый параметр метода расширения MapRoute - это название маршрута.При настройке проекта MVC вы получаете:

routes.MapRoute( _ 
    ' "Default" is your route name. It can be null, "" or some other name that you give it
    "Default", _     

    ' This is your URL with parameters
    "{controller}/{action}/{id}", _

    ' Parameter defaults
    new { .controller = "Home", .action = "Index", .id = UrlParameter.Optional })

Параметр имени маршрута позволяет вам вызывать контроллер и действие, просто используя имя.Например, вместо:

return RedirectToAction("ActionName", "ControllerName", new { paramId = 1234 });

вы можете использовать имя маршрута, например

return RedirectToRoute("MyRouteName", new { paramId = 1234 });

Что касается конфигурации маршрута, она должна выглядеть примерно так:

routes.MapRoute( _
    "YourRouteName", _   
    "ApplicationModule/{id}", _
    New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParemeter.Optional })

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

И еще одно предложение для конца, вместо использования:

href="<%= ResolveUrl("~/") %>ApplicationModule/Index/<%= Html.Encode(app.id) %>"

используйте Url.Content следующим образом:

href="<%= Url.Content("Index", "ApplicationModule", With New { .id = app.id })"

Это автоматически разрешит ваш виртуальный путьи выглядит немного аккуратнее.Если у вас появится возможность освоить Pro ASP.NET MVC 2 Framework Стивена Сандерсона, вы получите гораздо более четкое представление об URL-адресах и механизме маршрутизации.*

1 голос
/ 03 августа 2011

По умолчанию это просто название маршрута.

Вы можете настроить маршрут, который будет делать это, но он, скорее всего, сломает остальную часть вашего сайта.

Проблема в том, что вы хотите, чтобы он автоматически обрабатывал 2-й параметр в URL как идентификатор, но как он узнал, что это идентификатор, а не имя метода действия?

0 голосов
/ 03 августа 2011

Ответ на 1: «По умолчанию» - это просто название маршрута для вашей внутренней ссылки, которое поможет вам описать, для чего этот маршрут.

Ответ на вопрос 2: добавьте это сопоставление ДО ПЕРЕД стандартным.

routes.MapRoute( _  
  "ApplicationModuleIndex", _
  "ApplicationModule/{id}", _
  New With {.controller = "ApplicationModule", .action = "Index", .id = UrlParameter.Optional} _  
)

Это может иметь побочный эффект, заключающийся в том, что URL «ApplicationModule / Action» (т.е. без идентификатора) может просто вызвать действие индекса вместо этого, и вам может понадобиться дополнительный маршрут (до предыдущего) из

 routes.MapRoute( _  
                "ApplicationModule", _
                "ApplicationModule/{action}", _
                New With {.controller = "ApplicationModule", .action = "Index"} _  
                New With {.action = "Index|Action1|Action2"} _
      )

Заменить "Index|Action1|Action2" на | отдельный список действительных действий

В качестве альтернативы вы можете просто сбросить добавление этих новых маршрутов и переопределить HandleUnknownAction

например.

в вашем контроллере ApplicationModule

protected override void HandleUnknownAction(string actionName) {
  var result = Index(actionName);
  result.ExecuteResult(ControllerContext);
}
...