Wie Ordner und Controller mit dem gleichen Namen in ASP.NET MVC haben?
-
08-07-2019 - |
Frage
Ich habe einen MVC-Controller genannt Downloads. http: // mysite / Downloads
Ich möchte auch eine physische Datei in einem physischen Ordner abzulegen genannt http: //mysite/Downloads/MyFile.zip .
Wenn ich einfach einen Ordner erstellen, erhalte ich eine 403 beim Surfen auf http: // mysite / Downloads . (Wahrscheinlich wegen Durchsuchen von Verzeichnissen ist deaktiviert) Aber ich möchte, dass die MVC-Controller in anstatt kicken.
Wie kann ich das tun?
Lösung
Wenn Sie wechseln Sie http://mysite/Downloads/{ACTION}
wird es Ihre Controller Aktion ausgelöst.
Das einzige, was in Ihrem Beispiel wird nicht funktionieren, ist die /Downloads
ohne Wirkung. Sie können diese URL neu schreiben Sie Ihre Standard-Aktion zu umleiten.
Darüber hinaus müssen Sie die routehandler der Download ignorieren Dateien haben. Sie können eine Zeile in der Datei global.asax hinzufügen alle Zip-Dateien oder ein anderen ignorieren Muster zu ignorieren, die passen.
routes.Ignore("{resource}.zip");
Andere Tipps
Da .NET 3.5 können Sie Route vorhandene Dateien:
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 }
);
}
So nehmen wir einen Ordner auf der Site-Stamm namens Markets
enthält eine audio.mp3
Datei hatte:
\Markets
\Markets\audio.mp3
Unter der Annahme der Existenz eines MarketsController
, wenn wir einen Antrag auf Markets
gemacht, es verlegt werden würde Markets/Index
.
Wenn wir /Markets/audio.mp3
baten wir die MP3-Datei bekommen würde, und wenn wir Markets/AnythingElse
angefordert würden normalen Routing gelten.