Come avere cartella e controller con lo stesso nome in ASP.NET MVC?
-
08-07-2019 - |
Domanda
Ho un controller MVC chiamato Download. http: // mysite / Download
Voglio anche mettere un file fisico in una cartella fisica chiamata http: //mysite/Downloads/MyFile.zip .
Se creo semplicemente una cartella, ottengo un 403 quando sfoglio http: // mysite / Download . (Molto probabilmente a causa della navigazione nella directory è disabilitato) Voglio invece avviare il controller MVC.
Come posso farlo?
Soluzione
Se si accede a http: // mysite / Downloads / {ACTION}
, si attiva l'azione dei controller.
L'unica cosa che non funzionerà nel tuo esempio è il / Download
senza alcuna azione. Puoi riscrivere questo URL per reindirizzarti all'azione predefinita.
Inoltre, dovrai fare in modo che il gestore del percorso ignori i tuoi file di download. Puoi aggiungere una riga nel tuo file global.asax per ignorare tutti i file zip o qualche altro motivo ignorato adatto.
routes.Ignore("{resource}.zip");
Altri suggerimenti
Da .NET 3.5, è possibile instradare i file esistenti:
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 }
);
}
Quindi supponiamo di avere una cartella nella radice del sito chiamata Markets
contenente un file audio.mp3
:
\Markets
\Markets\audio.mp3
Supponendo l'esistenza di un MarketsController
, se facessimo una richiesta per Markets
, verrebbe indirizzato a Markets / Index
.
Se avessimo richiesto /Markets/audio.mp3
avremmo ottenuto il file mp3 e se avessimo richiesto Markets / AnythingElse
, verrebbe applicato il normale routing.