Как иметь папку и контроллер с одинаковым именем в ASP.NET MVC?
-
08-07-2019 - |
Вопрос
У меня есть контроллер MVC, который называется «Загрузки». http: // mysite / Downloads
Я также хочу поместить физический файл в физическую папку с именем http: //mysite/Downloads/MyFile.zip . р>
Если я просто создаю папку, я получаю 403 при переходе по адресу http: // mysite / Downloads . (Скорее всего из-за просмотра каталогов отключен) Но я хочу, чтобы вместо этого включился контроллер MVC.
Как мне это сделать?
Решение
Если вы перейдете по адресу http: // mysite / Downloads / {ACTION}
, это вызовет действие ваших контроллеров.
Единственное, что не сработает в вашем примере, это / Downloads
без каких-либо действий. Вы можете переписать этот URL, чтобы перенаправить вас к действию по умолчанию.
Кроме того, вам потребуется, чтобы обработчик маршрута игнорировал ваши загружаемые файлы. Вы можете добавить строку в свой файл global.asax, чтобы игнорировать все zip-файлы или другой подходящий шаблон игнорирования.
routes.Ignore("{resource}.zip");
Другие советы
Начиная с .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
, будет применяться обычная маршрутизация.