Pregunta

¿Cuál es la forma correcta para encontrar la ruta absoluta a la carpeta App_Data desde un controlador en un proyecto ASP.NET MVC? Me gustaría ser capaz de funcionar temporalmente con un archivo .xml y yo no quiero codificar el camino.

Esto no funciona:

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

        //.... do whatever 

        return View();
    }

}

Creo fuera del contexto web VirtualPathUtility.ToAbsolute () no funciona. string ruta regresa como "C: \ App_Data \ somedata.xml"

¿Dónde debería determinar la ruta del archivo .xml en una aplicación MVC? Global.asax y pegarlo una variable de nivel de aplicación?

¿Fue útil?

Solución

ASP.NET MVC1 -> MVC3

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

ASP.NET MVC4

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


MSDN Referencia:

HttpServerUtility.MapPath Método

Otros consejos

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

Esta es probablemente una manera más "correcta" de hacer las cosas.

Intento conseguir en el hábito de usar HostingEnvironment en lugar de Server ya que funciona en el contexto de los servicios de WCF también.

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

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

.

Si usted necesita la ruta a ~ / App_Data de una clase en la que no tiene acceso a la HttpContext siempre se puede inyectar una interfaz de proveedor de la utilización de su contenedor IoC:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

Implementar usando su HttpApplication:

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

Cuando MyHttpApplication.GetAppDataPath se ve así:

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

Phil Haak tiene un ejemplo que creo que es un poco más estable cuando se trata de caminos con locas "\" separadores de directorios estilo. También maneja con seguridad concatenación camino. Se trata de forma gratuita en System.IO

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

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

string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

o

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
string Index = i;
            string FileName = "Mutton" + Index + ".xml";
            XmlDocument xmlDoc = new XmlDocument();

            var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
            xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);

esta es la mejor solución para obtener la ruta exactamente lo que se necesita por ahora

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top