Почему этот параметр маршрута привязан к квистрингу?

У меня есть приложение ASP.NET MVC 3, которое регистрирует записи шагомера пользователя. Пользователь может просмотреть все последние записи шагомера, посетив /Pedometer, и может фильтровать по году, году/месяцу или году/месяцу/дате, посетив URL-адреса, например /Pedometer/2011, /Pedometer/2011/08 и /Pedometer/2011/08/15, соответственно.

Я создал два картографических маршрута в Global.asax. Первый маршрут, показанный ниже, позволяет различные шаблоны URL для фильтрации по дате. Второй маршрут (не показан) является маршрутом ASP.NET MVC по умолчанию.

routes.MapRoute(
    "PedometerEntries", // Route name
    "Pedometer/{year}/{month}/{day}", // URL with parameters
    new
    {
        controller = "Pedometer",
        action = "Index",
        year = UrlParameter.Optional,
        month = UrlParameter.Optional,
        day = UrlParameter.Optional
    }, // Parameter defaults
    new
    {
        year = @"\d{4}",
        month = @"([012]?\d{1})?",
        day = @"(([1-9])|([12][0-9])|(3[0-1]))?"
    } // Parameter constraints
);

Вот мой вопрос. У меня есть вид, где я хочу создать ссылку на форму: currentUrl?format=csv, который позволит пользователю загрузить записи шагомера для запрашиваемого URL в формате CSV. Таким образом, если пользователь посещает /Pedometer, то ссылка для загрузки будет на /Pedometer?format=csv. Если пользователь посещает /Pedometer/2011/08, то ссылка для загрузки будет на /Pedometer/2011/08?format=csv.

Для создания такой ссылки я добавил пользовательскую Html-помощницу под названием DownloadToExcel со следующим кодом:

public static MvcHtmlString DownloadToExcel(this HtmlHelper helper, string linkText)
{
    RouteValueDictionary routeValues = helper.ViewContext.RouteData.Values;

    // Add the format parameter to the route data collection, if needed
    if (!routeValues.ContainsKey("format"))
        routeValues.Add("format", "csv");

    return helper.ActionLink(linkText,                          // Link text
                                routeValues["action"].ToString(),  // Action
                                routeValues);                      // Route values
}

Когда я добавляю @Html.DownloadToExcel() разметку на мой взгляд, она генерирует ссылку, но вот рубрика - когда пользователь посещает последние записи или записи, отфильтрованные по году/месяцу или году/месяцу/дате, она работает так, как и ожидалось, но не когда пользователь посещает URL фильтра по годам.

В следующем списке показан URL-адрес, который посещает пользователь, и соответствующий URL-адрес, сгенерированный пользователем Html Helper:

  • Visiting: /Шагомер - Ссылка для скачивания: /Pedometer?format=csv
  • Visiting: /Pedometer/2011 - Ссылка для скачивания: /Pedometer?year=2011&format=csv
  • Visiting: /Шагомер/2011/08 - Ссылка для скачивания: /Pedometer/2011/08?format=csv
  • Visiting: /Pedometer/2011/08/15 - Ссылка для скачивания: /Pedometer/2011/08/15?format=csv

Почему при посещении /Pedometer/2011 ссылка на скачивание составляет /Pedometer?year=2011&format=csv, а не /Pedometer/2011?format=csv? И почему она не работает для этого случая, а работает, как ожидается, для случая год/месяц и год/месяц/дата?

Спасибо

6
задан Scott Mitchell 16 August 2011 в 22:19
поделиться