Como ter pasta e controlador com o mesmo nome no ASP.NET MVC?
-
08-07-2019 - |
Pergunta
Eu tenho um controlador MVC chamado downloads. http: // mysite / downloads
Eu também quero colocar um arquivo físico em uma pasta física chamada http: //mysite/Downloads/MyFile.zip .
Se eu simplesmente criar uma pasta, recebo um 403 ao navegar para http: // mysite / downloads . (Muito provavelmente por causa de navegação de diretório está desativado) Mas eu quero o controlador MVC para chutar vez.
Como posso fazer isso?
Solução
Se você navegar até http://mysite/Downloads/{ACTION}
ele vai disparar a sua acção controladores.
A única coisa que não vai funcionar no seu exemplo é o /Downloads
sem ação. Você poderia re-escrever esta URL para redirecioná-lo para a sua ação padrão.
Além disso, você precisará ter o routehandler ignorar seus arquivos de download. Você pode adicionar uma linha em seu arquivo global para ignorar todos os arquivos zip ou algum outro ignorar padrão que ternos.
routes.Ignore("{resource}.zip");
Outras dicas
Desde .NET 3.5, você pode encaminhar arquivos existente:
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 }
);
}
Assim, suponha que tinha uma pasta na raiz do site chamado Markets
contendo um arquivo audio.mp3
:
\Markets
\Markets\audio.mp3
Assumindo a existência de um MarketsController
, se fez um pedido de Markets
, seria encaminhado para Markets/Index
.
Se solicitado /Markets/audio.mp3
teríamos o arquivo mp3 e se solicitado Markets/AnythingElse
, rota normal seria aplicável.