obtener net mvc from current content asp .net asp.net-mvc absolute-path

.net - net - obtener url c#



ASP.NET MVC-Encuentre la ruta absoluta a la carpeta App_Data desde el controlador (7)

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"); Referencia de MSDN:

Método HttpServerUtility.MapPath

¿Cuál es la forma correcta de encontrar la ruta absoluta a la carpeta App_Data desde un controlador en un proyecto MVC de ASP.NET? 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 web VirtualPathUtility.ToAbsolute () no funciona. la ruta de la cadena vuelve como "C: / App_Data / somedata.xml"

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


Intento acostumbrarme a usar HostingEnvironment lugar de Server ya que también funciona dentro del contexto de los servicios WCF.

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


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

Si necesita la ruta a ~ / App_Data de una clase en la que no tiene acceso a HttpContext , siempre puede inyectar una interfaz de proveedor utilizando su contenedor IoC:

public interface IAppDataPathProvider { string GetAppDataPath(); }

Implementalo usando tu HttpApplication :

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

Donde MyHttpApplication.GetAppDataPath 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 rutas con separadores de directorios al estilo "/". También maneja con seguridad la concatenación del camino. 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 puede probar "AppDomain.CurrentDomain.BaseDirector" en lugar de "Server.MapPath".


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 el camino que es exactamente necesario por ahora.


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

O

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


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

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