Как иметь папку и контроллер с одинаковым именем в ASP.NET MVC? - PullRequest
11 голосов
/ 17 сентября 2009

У меня есть контроллер MVC, который называется «Загрузки». http://mysite/Downloads

Я также хочу поместить физический файл в физическую папку с именем http://mysite/Downloads/MyFile.zip.

Если я просто создаю папку, я получаю 403 при просмотре http://mysite/Downloads. (Скорее всего из-за просмотра каталогов отключен) Но я хочу, чтобы вместо этого включился контроллер MVC.

Как мне это сделать?

Ответы [ 2 ]

5 голосов
/ 08 октября 2015

Начиная с .NET 3.5, вы можете маршрутизировать существующие файлы:

public static void RegisterRoutes(RouteCollection routes) {
    routes.RouteExistingFiles = true;
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", 
                          action = "Index", 
                          id = UrlParameter.Optional }
    );
}

Предположим, у нас в корневом каталоге сайта была папка Markets, содержащая файл audio.mp3:

\Markets
\Markets\audio.mp3

Предполагая существование MarketsController, если мы сделаем запрос на Markets, он будет перенаправлен на Markets/Index.

Если бы мы запросили /Markets/audio.mp3, мы бы получили mp3-файл, а если бы мы запросили Markets/AnythingElse, применима обычная маршрутизация.

5 голосов
/ 17 сентября 2009

Если вы перейдете к http://mysite/Downloads/{ACTION}, это вызовет действие ваших контроллеров.

Единственное, что не сработает в вашем примере - это /Downloads без действий. Вы можете переписать этот URL, чтобы перенаправить вас к действию по умолчанию.

Кроме того, вам потребуется, чтобы обработчик маршрута игнорировал ваши загружаемые файлы. Вы можете добавить строку в свой файл global.asax, чтобы игнорировать все zip-файлы или другой подходящий шаблон игнорирования.

routes.Ignore("{resource}.zip");
...