Как создать папку и контроллер с таким же именем в ASP.NET MVC?

У меня есть MVC-контроллер под названием Downloads. http://mysite/Downloads

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Начиная с .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

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

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