Asp.Net MVC: как заставить Html.ActionLink правильно отображать целочисленные значения?

У меня есть приложение asp.net mvc с маршрутом, похожим на:

routes.MapRoute("Blog", 
    "{controller}/{action}/{year}/{month}/{day}/{friendlyName}",                          
    new { controller = "Blog", action = "Index", id = "", friendlyName="" }, 
    new { controller = @"[^\.]*", 
          year = @"\d{4}", 
          month = @"\d{2}", 
          day = @"\d{2}" }
);

Сигнатура метода действия моего контроллера выглядит так:

public ActionResult Detail(int year, int month, int day, string friendlyName)
{ // Implementation... }

На мой взгляд, я делаю что-то вроде:

<%= Html.ActionLink<BlogController>(item => item.Detail(blog.PostedOn.Year, blog.PostedOn.Month, blog.PostedOn.Day, blog.Slug), blog.Title) %>

Хотя URL-адрес, созданный с помощью ActionLink, работает, он использует переменные строки запроса, а не перезапись URL-адреса.

Например, он будет создавать / blog / detail / my-slug? Year = 2008 & month = 7 & day = 5 вместо / blog / detail / 2008/07/05 / my-slug.

Есть ли способ заставить общую версию ActionLink правильно дополнять целочисленные значения, чтобы URL-адрес отображался так, как ожидалось?

Спасибо

Джим


person Jim Geurts    schedule 28.09.2008    source источник


Ответы (2)


Вместо этого я бы предложил форматировать год, месяц и день как строки. Подумайте об этом: будете ли вы делать какие-нибудь вычисления с этими «целыми числами»? Наверное, нет, поэтому действительно нет смысла делать их целыми числами. Как только у вас есть их как строки, вы можете принудительно использовать начальный нулевой формат.

person Gilligan    schedule 28.09.2008

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

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

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

person Jonathan Carter    schedule 28.09.2008
comment
Маршрут, к сожалению, вверху. Я все же посмотрю на отладчик. - person Jim Geurts; 28.09.2008