2009-09-17 8 views
11

J'ai un contrôleur MVC appelé Téléchargements. Je veux également mettre un fichier physique dans un dossier physique appelé http://mysite/Downloads/MyFile.zip.Comment faire pour avoir le dossier et le contrôleur avec le même nom dans ASP.NET MVC?

Si je crée simplement un dossier, je reçois un 403 lors de la navigation à http://mysite/Downloads. (Le plus probable en raison de la navigation dans le répertoire est désactivé) Mais je veux que le contrôleur MVC démarre à la place.

Comment faire cela?

Répondre

5

Si vous naviguez jusqu'à http://mysite/Downloads/{ACTION}, il déclenchera l'action de vos contrôleurs.

La seule chose qui ne fonctionnera pas dans votre exemple est le /Downloads sans action. Vous pouvez réécrire cette URL pour vous rediriger vers votre action par défaut.

En outre, vous devrez faire en sorte que le routinier ignore vos fichiers de téléchargement. Vous pouvez ajouter une ligne dans votre fichier global.asax pour ignorer tous les fichiers zip ou un autre motif ignoré qui convient.

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

Depuis .NET 3.5, vous pouvez acheminer les fichiers existants:

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 } 
    ); 
} 

suppose donc que nous avions un dossier sur la racine du site appelé Markets contenant un fichier audio.mp3:

\Markets 
\Markets\audio.mp3 

En supposant l'existence d'un MarketsController, si nous avons fait une demande pour Markets, il serait acheminé à Markets/Index.

Si nous demandions /Markets/audio.mp3 nous obtiendrions le fichier mp3 et si nous demandions Markets/AnythingElse, le routage normal s'appliquerait.

Questions connexes