2016-10-17 17 views
1

У меня есть страница индекса MVC4, которые имеют следующие ссылки:MVC4 ActionLink без параметров указывает на пути тока

@Html.ActionLink("FOO", "Index", "Mil", new { year = String.Empty, id = String.Empty }, null) 
@Html.ActionLink("BAR", "Index", "Euro", new { year = String.Empty, id = String.Empty }, null) 

Но как ни странно, как превратить в гиперссылку на ТОКА пути (то есть, если мы находимся в domain/Euro/2016/1 и ссылку на этот адрес) вместо указания на указанный контроллер.

Все нормально в RouteConfig:

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{year}/{id}", 
      defaults: new { controller = "Home", action = "Index", year = UrlParameter.Optional, id = UrlParameter.Optional } 
     ); 

Контроллеры/Действия существуют и работают отлично:

EuroController:

public ActionResult Index(int? year, int? id) 
{ 
    ... 
} 

Что может быть причиной этого странное поведение?

EDIT:

Если я прохожу параметр года, работает отлично: @Html.ActionLink("FOO", "Index", "Mil", new { year = 666, id = String.Empty }, null) правильно указывает на домен /мили/666.

+0

, вероятно, не вопрос, но только последний параметр может быть помечен как 'UrlParameter.Optional' –

+0

Я редактировал мой вопрос. Это не решение, но, безусловно, связано. Я изменил 'year = UrlParameter.Optional' в Routes to' year = "" ', как вы предполагали, но проблема осталась. –

+0

либо используйте 'null', то есть:' @ Html.ActionLink («FOO», «Index», «Mil», new {year = null, id = null}, null) 'или удалить их все вместе, то есть:' @ Html.ActionLink («FOO», «Index», «Mil», null, null) ' – Nkosi

ответ

1

Я был в состоянии заставить это работать, добавив это Новый маршрут после По умолчанию.

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{year}/{id}", 
       defaults: new { controller = "Home", action = "Index", year = "", id = UrlParameter.Optional } 
       ); 
routes.MapRoute(
       name: "New", 
       url: "{controller}/{year}", 
       defaults: new { controller = "Home", action = "Index", year = UrlParameter.Optional } 
       ); 

Все последующие ссылки производят желаемый эффект:

@Html.ActionLink("Euro 2014", "Index", "Euro", new { year = 2014 }, null) 
@Html.ActionLink("Euro 2015", "Index", "Euro", new { year = 2015, id = String.Empty }, null) 
@Html.ActionLink("Euro 2016", "Index", "Euro", new { year = DateTime.Now.Year, id = "" }, null) 
@Html.ActionLink("Back to Euro", "Index", "Euro", new { year = String.Empty }, null)