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?

È stato utile?

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:

HttpServerUtility.MapPath metodo

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top