2009-09-17 13 views
11

Ho un controller MVC chiamato Download. http://mysite/DownloadsCome avere cartelle e controller con lo stesso nome in ASP.NET MVC?

Voglio anche mettere un file fisico in una cartella fisica denominata http://mysite/Downloads/MyFile.zip.

Se si crea semplicemente una cartella, ottengo un 403 quando si sfoglia a http://mysite/Downloads. (Molto probabilmente a causa della navigazione nella directory è disabilitato) Ma voglio che il controller MVC calci invece.

Come faccio?

risposta

5

Se si passa a http://mysite/Downloads/{ACTION}, l'azione del controller verrà attivata.

L'unica cosa che non funziona nel tuo esempio è /Downloads senza azione. È possibile riscrivere questo URL per reindirizzare l'utente all'azione predefinita.

Inoltre, è necessario che il routehandler ignori i file di download. Puoi aggiungere una riga nel tuo file global.asax per ignorare tutti i file zip o altri pattern di ignoranza adatti.

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

Dal .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 abbiamo avuto una cartella nella directory principale sito chiamato Markets contenente un file di audio.mp3:

\Markets 
\Markets\audio.mp3 

Assumendo l'esistenza di un MarketsController, se abbiamo fatto una richiesta per Markets, sarebbe stato indirizzato a Markets/Index.

Se abbiamo richiesto /Markets/audio.mp3 avremmo ottenuto il file mp3 e se abbiamo richiesto Markets/AnythingElse, si applicherebbe il routing normale.

Problemi correlati