Маршруты ASP.NET MVC с расширениями файлов

Я хочу сделать MVC-маршрут для списка новостей, который может подаваться в нескольких форматах.

  • новости -> (X)HTML
  • новости.rss -> RSS
  • новости.атом -> АТОМ

Возможно ли сделать это (более общая ситуация с «необязательным расширением» возникает в нескольких местах моего запланированного проекта) с одним маршрутом? Или мне нужно сделать два маршрута, как это:

routes.MapRoute("News-ImplicitFormat",
                "news",
                new { controller = "News", action = "Browse", format = "" });

routes.MapRoute("News-ExplicitFormat",
                "news.{format}"
                new { controller = "News", action = "Browse" });

Кажется, было бы полезно, чтобы система маршрутизации поддерживала что-то вроде:

routes.MapRoute("News",
                "news(.{format})?",
                new { controller = "News", action = "Browse" });

person Doug McClean    schedule 01.11.2008    source источник


Ответы (2)


Я сделал метод для поддержки добавления таких пар следующим образом:

public static void MapRouteWithOptionalFormat(this RouteCollection routes,
                                              string name,
                                              string url,
                                              object defaults)
{
    Route implicitRoute = routes.MapRoute(name + "-ImplicitFormat",
                                          url,
                                          defaults);
    implicitRoute.Defaults.Add("format", string.Empty);

    Route explicitRoute = routes.MapRoute(name + "-ExplicitFormat",
                                          url + ".{format}",
                                          defaults);
}
person Doug McClean    schedule 01.11.2008
comment
Это работает хорошо, хотя я поменял порядок неявных и явных маршрутов из-за того, что явные маршруты более конкретны. - person ern; 26.05.2010

Вы можете изучить использование ограничений, чтобы заставить это работать с обычными маршрутами.

ОБНОВЛЕНИЕ: на самом деле я неправильно понял вопрос. Другой ответ - это правильное решение на данный момент. Или создайте собственный маршрут. Мы рассматриваем идею необязательных сегментов как возможную будущую функцию.

person Haacked    schedule 02.11.2008
comment
Фил, что бы я хотел ограничить? .Содержит(.)? Не могли бы вы кратко изложить эту стратегию? Шикарная работа, кстати. Спасибо! - person Doug McClean; 02.11.2008
comment
Фил Хаак получил отрицательный ответ на вопрос MVC, держу пари, что это случается не слишком часто :) - person fearofawhackplanet; 18.05.2011
comment
Я знаю, что это 2-3 года назад, но возможно ли это сейчас? Мне было интересно, могу ли я иметь /post/15 = html, /post/15.json = json API-данные. - person Alxandr; 24.06.2011
comment
О, и я хочу, чтобы они шли по разным маршрутам в зависимости от концовки, чтобы у меня были API-контроллеры. - person Alxandr; 24.06.2011