2011-09-29 10 views
23

Ho il codiceUtilizzando Server.MapPath in MVC3

string xsltPath = System.Web.HttpContext.Current.Server.MapPath(@"App_Data") + "\\" + TransformFileName 

Esso restituisce

C:\inetpub\wwwroot\websiteName\SERVICENAME\App_Data\FileName.xsl

Perché mi appare il percorso del ServiceController, SERVICENAME? Voglio che il percorso per App_Data che è in

C:\inetpub\wwwroot\websiteName\App_Data\FileName.xsl

risposta

57

È necessario specificare che si desidera avviare dalla radice virtuale:

string xsltPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"), TransformFileName); 

Inoltre, è pratica meglio usare Path.Combine per combinare i percorsi piuttosto che concatenare le stringhe. Path.Combine assicurerà che non si finisca in una situazione con separatori a doppio percorso.

EDIT:

Puoi definire percorsi "relativi" "assoluti" e e come si confronta con percorsi "fisici" e "virtuali"?

MSDN ha un good explanation su percorsi relativi, fisici e virtuali. Dai un'occhiata qui.

+0

Questo funziona. Stavo leggendo un articolo sulla "radice virtuale", ma non l'ho seguito bene. http://www.dotnetperls.com/mappath Puoi definire percorsi "assoluti" e "relativi" e come si confrontano con percorsi "fisici" e "virtuali"? –

+1

@ P.Brian.Mackey: Absolute indica il percorso dalla radice, ad esempio "/ someTopDirectory/someSubDirectory". Relativo indica un percorso dal punto in cui ci si trova attualmente, quindi se ci si trova in "someSubDirectory" e si desidera ottenere "someTopDirectory", un percorso relativo è ".." (andare su una directory). I percorsi fisici sono percorsi come il sistema li vede: "C: \ inetpub \ myApp \ someTopDirectory \ someSubDirectory". I percorsi virtuali sono come le applicazioni del server Web: "/ someTopDirectory/someSubDirectory". –

+0

@ P.Brian.Mackey: per chiarire meglio la situazione, MapPath converte un percorso virtuale in un percorso fisico. Nel parametro per il percorso virtuale, si desidera fornire un percorso assoluto anziché uno relativo. Il marcatore per indicare la "radice" per il percorso assoluto in un'applicazione Web è "~", quindi la radice virtuale assoluta = "~ /". –

0

Provare a fare così (@"~/App_Data"). ~/ rappresenta la directory principale.

6

Le risposte date finora sono quello che stai cercando, ma credo che, nel vostro caso particolare, quello che bisogno reale è questa:

AppDomain.CurrentDomain.GetData("DataDirectory").ToString() 

Questo sarà ancora tornare il percorso del file nella directory App_Data se il nome della directory cambia nelle versioni future di MVC o ASP.NET.

+0

Non penso che questa sia una buona idea. Stai facendo affidamento su un parametro AppDomain (ufficialmente) non documentato, è un dettaglio di implementazione. È molto più probabile che cambi di "App_Data". – vcsjones

+0

È documentato e standard, ma è per ADO.Net, non ASP.Net in particolare. 'DataDirectory' non cambierà, ma potrebbe non puntare sempre a' App_Data'. – codekaizen