2012-09-02 2 views
36

Wie löse ich Pfade relativ zum Stammverzeichnis einer ASP.NET MVC 4-Anwendung auf? Das heißt, ich möchte Dateien, die zur Anwendung gehören, aus Controller-Aktionen öffnen, die wie ~/Data/data.html referenziert werden. Diese Pfade werden normalerweise in Web.config angegeben.Wie löse ich einen Pfad relativ zu einem ASP.NET MVC 4-Anwendungsstamm auf?

EDIT:

von ‚Entschlossenheit‘ Ich meine einen Pfad relativ zu der Anwendung der Root-Verzeichnis in einen absoluten Pfad zu verwandeln, .e.g. ~/Data/data.htmlC:\App\Data\Data.html.

+1

So erhalten Sie 'Referenz' diese Dateien von der Wurzel ... –

+0

@Nate Was meinst du, dass die ~ automatisch erweitert wird? – aknuds1

+0

[HttpContext.Current.Server.MapPath] (http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx)? – nemesv

Antwort

68

auf den absoluten Pfad verwenden diese:

String path = HttpContext.Current.Server.MapPath("~/Data/data.html"); 

EDIT:

auf den Kontext des Controllers erhalten .Current aus der obigen Zeile entfernen. Durch die Verwendung von HttpContext allein ist es einfacher zu testen, da es auf dem Context des Controllers basiert und daher mehr lokalisiert ist.

Ich weiß jetzt, dass ich mag nicht, wie Server.MapPath Werke (intern schließlich rufen HostingEnvironment.MapPath) Also empfehle ich jetzt immer HostingEnvironment.MapPath zu verwenden, da seine statische und nicht abhängig vom Kontext außer natürlich, Sie wollen, dass ...

+0

Ich möchte nur die Datei auf dem Server lesen, es wird nicht an den Client zurückgegeben. – aknuds1

+0

Dies ist der Weg, es zu tun. Wenn Sie dies auch statisch verwenden müssen, lesen Sie diese Frage: http: // stackoverflow.com/questions/3795986/using-server-mappath-inside-a-static-feld-in-asp-net-mvc –

+0

Ich bin in einer nicht-statischen Methode einer System.Web.Mvc.Controller-Unterklasse, aber ' HttpContext' hat keine Eigenschaft 'Current'. Was geht? – aknuds1

4

In der Aktion können Sie anrufen:

this.Request.PhysicalPath 

, die den physischen Pfad in Bezug auf den Stromregler zurückgibt. Wenn Sie nur den Root-Pfad Aufruf benötigen:

this.Request.PhysicalApplicationPath 
10

Nur verwenden Sie die folgende

Server.MapPath("~/Data/data.html") 
+0

Einfach und korrekt. Vielen Dank. – CodeBreaker

47

ich finde diesen Code nützlich, wenn ich außerhalb eines Controllers einen Weg benötigen, wie zum Beispiel, wenn ich Komponenten in Global.asax.cs bin Initialisierung:

HostingEnvironment.MapPath("~/Data/data.html") 
+1

HostingEnvironment.MapPath ist eine bessere Antwort. Wenn Sie den Code außerhalb des Kontexts einer HTTP-Anforderung ausführen, ist HttpContext.Current null und Ihr Code stürzt ab. HostingEnvironment.MapPath funktioniert immer. – JDC

+0

Das ist auch erwähnenswert, dass "HostingEnvironment.MapPath" kann angepasst werden, wenn Sie Ihre eigene Implementierung eines Virtual Path Provider haben. Funktioniert in jeder "gehosteten" Umgebung (Windows-Dienst oder IIS gehostet) https://support.microsoft.com/en-us/kb/910441 – Rikki

Verwandte Themen