2011-09-29 11 views
23

tengo el códigoServer.MapPath en MVC3

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

Devuelve

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

¿Por qué recibo el camino a la ServiceController, SERVICENAME? Quiero que el camino hacia la App_Data que está en

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

Respuesta

57

Es necesario especificar que desea empezar desde la raíz virtual:

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

Además, es mejor práctica utilizar Path.Combine combinar caminos en lugar de concatenar cadenas. Path.Combine se asegurará de que no termine en una situación con separadores de doble vía.

EDITAR:

¿Puede definir "absolutos" y caminos "relativas" y cómo se comparan con los caminos "físicos" y "virtuales"?

MSDN tiene un good explanation en rutas relativas, físicas y virtuales. Echa un vistazo allí.

+0

Esto funciona. Estaba leyendo un artículo sobre la "raíz virtual", pero no lo seguí bien. http://www.dotnetperls.com/mappath ¿Se pueden definir rutas "absolutas" y "relativas" y cómo se comparan con las rutas "físicas" y "virtuales"? –

+1

@ P.Brian.Mackey: Absoluto significa la ruta desde la raíz, como "/ someTopDirectory/someSubDirectory". Relativo significa una ruta desde donde se encuentra actualmente, de modo que si se encuentra en "someSubDirectory" y desea acceder a "algúnTopDirectory", una ruta relativa es ".." (suba un directorio). Las rutas físicas son rutas a medida que el sistema las ve: "C: \ inetpub \ myApp \ someTopDirectory \ someSubDirectory". Las rutas virtuales son como las ve una aplicación de servidor web: "/ someTopDirectory/someSubDirectory". –

+0

@ P.Brian.Mackey: para aclarar más en función de su situación, MapPath convierte una ruta virtual en una ruta física. En su parámetro para la ruta virtual, desea proporcionar una ruta absoluta en lugar de una relativa. El marcador para indicar la "raíz" de la ruta absoluta en una aplicación web es "~", por lo que la raíz virtual absoluta = "~ /". –

0

Intente hacer esto (@"~/App_Data"). ~/ representa el directorio raíz.

6

Las respuestas dadas hasta ahora son lo que usted está buscando, pero creo que, en su caso particular, lo que la necesidad real es la siguiente:

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

Esto todavía devolverá la ruta del archivo en el directorio App_Data si ese nombre de directorio cambia en futuras versiones de MVC o ASP.NET.

+0

No creo que esta sea una idea particularmente buena. Confía en un parámetro AppDomain no documentado (oficialmente), es un detalle de implementación. Es mucho más probable que cambie que 'App_Data'. – vcsjones

+0

Está documentado y es estándar, pero es para ADO.Net, no para ASP.Net en particular. 'DataDirectory' no cambiará, pero puede que no siempre apunte a' App_Data'. – codekaizen