ASP.NET MVC - trovare il percorso assoluto della cartella App_Data dal controller
-
13-09-2019 - |
Domanda
Qual è il modo corretto per trovare il percorso assoluto della cartella App_Data da un controller in un progetto ASP.NET MVC? Mi piacerebbe essere in grado di lavorare temporaneamente con un file .xml e io non voglio hardcode il percorso.
Questo non funziona:
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");
//.... do whatever
return View();
}
}
Credo che al di fuori del contesto web VirtualPathUtility.ToAbsolute () non funziona. string path ritorna come "C: \ App_Data \ somedata.xml"
Dove devo determinare il percorso del file XML in un app MVC? global.asax e bastone una variabile a livello di applicazione?
Soluzione
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 Riferimento:
Altri suggerimenti
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Questo è probabilmente un modo più "corretto" di ottenerlo.
Io cerco di prendere l'abitudine di usare HostingEnvironment
invece di Server
come funziona nel contesto di servizi WCF troppo.
HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
Il modo più corretto è quello di utilizzare HttpContext.Current.Server.MapPath("~/App_Data");
. Ciò significa che è possibile recuperare solo il percorso da un metodo in cui la HttpContext
è disponibile. Ha senso: la directory App_Data è una struttura di cartelle di progetto web [1]
Se è necessario il percorso ~ / App_Data da una classe in cui non si ha accesso al HttpContext
si può sempre iniettare un Provider Interface utilizzando il vostro contenitore CIO:
public interface IAppDataPathProvider
{
string GetAppDataPath();
}
Implementare utilizzando il tuo HttpApplication
:
public class AppDataPathProvider : IAppDataPathProvider
{
public string GetAppDataPath()
{
return MyHttpApplication.GetAppDataPath();
}
}
Dove MyHttpApplication.GetAppDataPath
appare come:
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/ it-it / library / ex526337% 28v = VS.100% 29.aspx
Phil Haak ha un esempio che credo sia un po 'più stabile quando si tratta di percorsi con folli "\" separatori di directory di stile. Inoltre gestisce in modo sicuro percorso concatenazione. Esso viene fornito gratuitamente in System.IO
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
Tuttavia, si potrebbe anche provare "AppDomain.CurrentDomain.BaseDirector" invece di "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);
questa è la migliore soluzione per ottenere il percorso che cosa è esattamente bisogno per ora