¿Cómo tener una carpeta y un controlador con el mismo nombre en ASP.NET MVC?
-
08-07-2019 - |
Pregunta
Tengo un controlador MVC llamado Descargas. http: // mysite / Downloads
También quiero poner un archivo físico en una carpeta física llamada http: //mysite/Downloads/MyFile.zip .
Si simplemente creo una carpeta, obtengo un 403 cuando navego a http: // mysite / Downloads . (Lo más probable es que debido a la exploración del directorio está deshabilitado) Pero quiero que el controlador MVC se active en su lugar.
¿Cómo hago eso?
Solución
Si navega hasta http: // mysite / Downloads / {ACTION}
, activará la acción de sus controladores.
Lo único que no funcionará en su ejemplo es el / Downloads
sin ninguna acción. Puede volver a escribir esta URL para redirigirlo a su acción predeterminada.
Además, deberá hacer que el controlador de ruta ignore sus archivos de descarga. Puede agregar una línea en su archivo global.asax para ignorar todos los archivos zip o algún otro patrón de ignorar que se adapte.
routes.Ignore("{resource}.zip");
Otros consejos
Desde .NET 3.5, puede enrutar archivos existentes:
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 }
);
}
Supongamos que tenemos una carpeta en la raíz del sitio llamada Markets
que contiene un archivo audio.mp3
:
\Markets
\Markets\audio.mp3
Suponiendo la existencia de un MarketsController
, si solicitamos Markets
, se enrutará a Markets / Index
.
Si solicitáramos /Markets/audio.mp3
obtendríamos el archivo mp3 y si solicitáramos Markets / AnythingElse
, se aplicaría el enrutamiento normal.