Url.Action повторно использует данные маршрута, когда я этого не хочу - PullRequest
0 голосов
/ 19 сентября 2011

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

@SiteSectionLink("index", "blog", "blog")

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

@helper SiteSectionLink(string action, string controller, string display)
  {
  <li>
    <h1>
      <a class="site-section" href="@Url.Action(action, controller)">@display</a></h1>
  </li>
}

На самой странице блога все ссылки также ссылаются на действие «Индекс», но также указывают либо параметр даты (например, «blog / 4-2011» или «blog / 2010»), который используетсяфильтровать сообщения по периоду дат.В дополнение к этому, есть также необязательный параметр postID, который используется для ссылки на определенный пост.

Для этого у меня есть следующие маршруты:

routes.MapRoute(
 "Blog", 
 "blog/{date}/{postID}", 
  new 
  { 
    controller = "blog", 
    action = "index", 
    date = UrlParameter.Optional, 
    postID = UrlParameter.Optional 
  } 
);

routes.MapRoute(
  "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Теперь проблема заключается в том, что, когда я нажал на ссылку, похожую на «blog / 11-2010» или «blog / 11-2010 / 253 "тогда ссылка на моей странице макета, которая ссылается на мой блог в целом, теперь также ссылается на тот же URL, когда я хочу, чтобы он просто ссылался на" blog / ", а не"blog / 11-2010 ".

Если я изменю помощнику SiteSectionLink, чтобы явно передать NULL для date и postID следующим образом:

<a class="site-section" href="@Url.Action(action, controller, 
  new { date = (string)null, postID = (int?)null})">@display</a></h1>

Текущие значения маршрута все ещеиспользуется, но теперь выглядит как «блог? дата = 11-2010».

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

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Хотя проблема, с которой вы сталкиваетесь, заключается не совсем в поведении, описанном Филом Хааком в этом сообщении в блоге об ошибке маршрутизации MVC3 и маршруте с двумя необязательными параметрами, я бы предложил применить исправление, описанное в Пост Фила.

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

1 голос
/ 19 сентября 2011

Да Метод Url.Action помещает параметры в строку запроса. Вы можете изменить своего помощника следующим образом:

@helper SiteSectionLink(string action, string controller, string display, string date = null, string id=null)
{ 
  <li> 
    @if (date == null)
    {
        <h1><a class="site-section" href="~/blog/@controller/@action">@display</a></h1> // simple workaround or better use P. Haack workaround
    }
    else 
    {
        <h1><a class="site-section" href="@Url.RouteUrl("blog", new { action = @action, controller = @controller, date = @date, id = @id })">@display</a></h1> 
    }
  </li> 
} 

Таким образом, вы можете использовать SiteSelectionLink следующим образом:

@SiteSectionLink("Index", "Blog", "test", "2011", "4")
@SiteSectionLink("Index", "Blog", "test2", "2011")
@SiteSectionLink("Index", "Blog", "test3")
...