277 votos

ASP.NET MVC - Encuentra el camino absoluto a la carpeta App_Data del Controlador

¿Cuál es la forma correcta de encontrar la ruta absoluta de la carpeta App_Data desde un Controlador en un proyecto ASP.NET MVC? Me gustaría poder trabajar temporalmente con un archivo .xml y no quiero codificar la ruta.

Esto no funciona:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

Creo que fuera del contexto de la web VirtualPathUtility.ToAbsolute() no funciona. La ruta de la cadena regresa como " C:\App_Data\somedata.xml "

¿Dónde debo determinar la ruta del archivo .xml en una aplicación MVC? global.asax y pegarlo como una variable de nivel de aplicación?

391voto

eu-ge-ne Puntos 17847

ASP.NET MVC1 -> MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

ASP.NET MVC4

string path = HttpContext.Server.MapPath("~/App_Data/somedata.xml");

Referencia MSDN:

HttpServerUtility.MapPath Method

270voto

jitbit Puntos 8072
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

Esta es la forma más "correcta" de conseguirlo.

134voto

Simon_Weaver Puntos 31141

Trato de acostumbrarme a usar HostingEnvironment en lugar de Server ya que también funciona en el contexto de los servicios de la WCF. También es menos mecanografía :-)

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");

7voto

Daniel Lidström Puntos 2970

La forma más correcta es usar HttpContext.Current.Server.MapPath("~/App_Data"); . Esto significa que sólo se puede recuperar el camino de un método en el que el HttpContext está disponible. Tiene sentido: el directorio App_Data es una estructura de carpetas de proyectos web [1].

Si necesitas la ruta a ~/App_Data de una clase en la que no tienes acceso al HttpContext siempre puedes inyectar una interfaz de proveedor usando tu contenedor de IO:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

Impleméntelo usando su HttpApplication :

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}

Donde MyHttpApplication.GetAppDataPath parece:

public class MyHttpApplication : HttpApplication
{
    // of course you can fetch&store the value at Application_Start
    public static string GetAppDataPath()
    {
        return HttpContext.Current.Server.MapPath("~/App_Data");
    }
}

[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx

6voto

Rudy Lattae Puntos 674

Phil Haak tiene un ejemplo que creo que es un poco más estable cuando se trata de caminos con separadores de directorios al estilo "loco". También maneja con seguridad la concatenación de caminos. Viene gratis en System.IO

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

Sin embargo, también podría probar con "AppDomain.CurrentDomain.BaseDirector" en lugar de "Server.MapPath".

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X