2012-09-02 13 views
36

Come si risolvono i percorsi relativi a una directory radice dell'applicazione ASP.NET MVC 4? Cioè, voglio aprire i file che appartengono all'applicazione dalle azioni del controllore, referenziati come ~/Data/data.html. Questi percorsi sono in genere specificati in Web.config.Come si risolve un percorso relativo a una radice dell'applicazione ASP.NET MVC 4?

EDIT:

Con 'risolvere' intendo trasformare un percorso relativo alla directory principale dell'applicazione per un percorso assoluto, .e.g. ~/Data/data.htmlC:\App\Data\Data.html.

+1

Ecco come ottieni "riferimento" a quei file da root ... –

+0

@Nate Cosa intendi, che il ~ viene espanso automaticamente? – aknuds1

+0

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

risposta

68

Per ottenere l'uso percorso assoluto questo:

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

EDIT:

ottenere il contesto del controllore rimuovere .Current dalla linea sopra. Usando HttpContext di per sé è più facile da testare perché è basato sul contesto del controller, quindi più localizzato.

Mi rendo conto ora che non mi piace come Server.MapPath opere (internamente chiama infine HostingEnvironment.MapPath) Così ora mi raccomando di usare sempre HostingEnvironment.MapPath perché la sua statica e non dipendente dal contesto, a meno che naturalmente si desidera che ...

+0

Voglio solo leggere il file sul server, non deve essere restituito al client. – aknuds1

+0

Questo è il modo per farlo. Inoltre, se è necessario utilizzarlo in modo statico, vedere questa domanda: http: // StackOverflow.it/questions/3795986/using-server-mappath-inside-a-campo-statico-in-asp-net-mvc –

+0

Sono in un metodo non statico di una sottoclasse System.Web.Mvc.Controller, ma ' HttpContext' non ha una proprietà 'Current'. Che cosa succede? – aknuds1

4

Nell'azione è possibile chiamare:

this.Request.PhysicalPath 

che restituisce il percorso fisico in riferimento al regolatore di corrente. Se avete solo bisogno della chiamata percorso principale:

this.Request.PhysicalApplicationPath 
10

Proprio utilizzare il seguente

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

Semplice e corretto. Grazie. – CodeBreaker

47

trovo questo codice utile quando ho bisogno di un percorso al di fuori di un controller, come quando sto inizializzazione componenti Global.asax.cs:

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

HostingEnvironment.MapPath è una risposta migliore. Quando esegui il codice al di fuori del contesto di una richiesta http, HttpContext.Current è nullo e il tuo codice si arresta in modo anomalo. HostingEnvironment.MapPath funziona sempre. – JDC

+0

Vale anche la pena ricordare che "HostingEnvironment.MapPath" può essere personalizzato se si dispone della propria implementazione di un provider di percorsi virtuali. Funziona in qualsiasi ambiente "ospitato" (servizio windows o iis ospitato) https://support.microsoft.com/en-us/kb/910441 – Rikki