2014-02-14 3 views
2

У меня есть два маршрута, объявленные в моем маршруте конфигурации, как это:Использовать определенный маршрут с Url.Action

routes.MapRoute(
    name: "SpecificAction", 
    url: "{controller}/{action}/{id}-{id2}", 
    defaults: new { controller = "Main", action = "SpecificAction", id = UrlParameter.Optional, id2 = UrlParameter.Optional } 
); 

routes.MapRoute(
    name: "DefaultNoParams", 
    url: "{controller}/{action}/", 
    defaults: new { controller = "Main", Action = "Index" }, 
    namespaces: new string[1] { "Project.Controllers" } 
); 

у меня есть два действия контроллера, которые выглядят следующим образом:

[HttpGet] 
public ActionResult TheAction() 
{ 

} 

[HttpPost] 
public ActionResult TheAction([ModelBinder(typeof(SpecificModelBinder))] SpecificModel model) 
{ 

} 

Я хочу ссылка на первый из этих действий, на мой взгляд, поэтому я генерировать один с помощью Url.Action:

<a href="@Url.Action("TheAction", "Main")">The Action</a> 

Однако, это выводит URL-адрес http://site/Main/TheAction/- (обратите внимание на тире в конце, что указывает на то, что мой маршрут SpecificAction используется.

Есть ли способ позвонить по номеру Url.Action по определенному маршруту? Или есть ли другой способ избежать этой черты, появляющейся в URL-адресе?

+1

Таблица маршрутизации не влияет на то, как «Url.Action» отображает URL-адрес ... Таким образом, ваша ссылка отображается как «'? –

+0

Odd... What is rendered when you add this to your View: 'The Action» –

ответ

2

Попробуйте изменить порядок ваших маршрутов. Поместите SpecificAction маршрут после DefaultNoParams маршрута, как показано ниже:

routes.MapRoute(
    name: "DefaultNoParams", 
    url: "{controller}/{action}/", 
    defaults: new { controller = "Main", Action = "Index" }, 
    namespaces: new string[1] { "Project.Controllers" } 
); 

routes.MapRoute(
    name: "SpecificAction", 
    url: "{controller}/{action}/{id}-{id2}", 
    defaults: new { controller = "Main", action = "SpecificAction", id = UrlParameter.Optional, id2 = UrlParameter.Optional } 
); 

Update: Для того, чтобы ответить ниже запрошенной вопрос:

Можете ли вы представить некоторые подробности относительно того, как таблица отображения маршрута будет влиять как URL. Действие генерирует URL-адрес таким образом, что тире было добавлено ?

Во-первых, ОП используется ниже код в представлении:

<a href="@Url.Action("TheAction", "Main")">The Action</a> 

он генерирует:

<a href="/Main/TheAction">The Action</a> 

Причина, почему существует тире потому, что оба параметра ID являются необязательными, так что без оба идентификатора, будет только тире, и она удовлетворяет условиям ниже маршрута.

routes.MapRoute(
      name: "SpecificAction", 
      url: "{controller}/{action}/{id}-{id2}", 
      defaults: new { controller = "Main", action = "SpecificAction", 
      id = UrlParameter.Optional, id2 = UrlParameter.Optional } 
    ); 

Если один из идентификаторов не является обязательным, он будет продолжать проверять следующие маршруты. Но OP необходимо, чтобы параметры id были необязательными, поэтому мое решение заключается в изменении заказов маршрута.

+0

Это сработало, спасибо! – Mansfield

+0

@ Lin Можете ли вы подробно рассказать о том, как сопоставление таблиц маршрутов повлияет на то, как «Url.Action» генерирует URL-адрес, который добавляет тире? –

+0

@ChrisHardie, я обновил ответ, чтобы получить более подробную информацию, взгляните. – Lin

7

Дубликат вопрос найден here

Короче говоря, использовать Url.RouteUrl() Intead из Url.Action(), чтобы получить правильный URL.

В вашем случае вы можете даже использовать @Html.RouteLink(), чтобы получить целую привязную метку, если хотите.

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