Pergunta

O que é a maneira correta de encontrar o caminho absoluto para a pasta App_Data de um controlador em um projeto ASP.NET MVC? Eu gostaria de ser capaz de funcionar temporariamente com um arquivo .xml e eu não quero codificar o caminho.

Isso não funciona:

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

        //.... do whatever 

        return View();
    }

}

Eu acho que fora do contexto web VirtualPathUtility.ToAbsolute () não funciona. string path volta como "C: \ App_Data \ somedata.xml"

Onde devo determinar o caminho do arquivo .xml em um aplicativo MVC? Global.asax e colá-la uma variável de nível de aplicativo?

Foi útil?

Solução

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 Referência:

HttpServerUtility.MapPath método

Outras dicas

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

Esta é provavelmente uma maneira mais "correta" de consegui-lo.

Eu tento adquirir o hábito de usar HostingEnvironment vez de Server como ele funciona dentro do contexto de serviços WCF também.

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

A maneira mais correta é usar HttpContext.Current.Server.MapPath("~/App_Data");. Isto significa que você só pode recuperar o caminho de um método onde o HttpContext está disponível. Faz sentido:. O diretório App_Data é uma estrutura de pastas do projeto web [1]

Se precisar o caminho para ~ / App_Data de uma classe onde você não tem acesso ao HttpContext você sempre pode injetar uma interface de provedor usando o contêiner IoC:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

implementá-lo usando o seu HttpApplication:

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

Onde olhares MyHttpApplication.GetAppDataPath como:

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 tem um exemplo que eu acho que é um pouco mais estável quando se lida com caminhos com loucos "\" separadores de diretório de estilo. Ele também lida com segurança caminho concatenação. Ele vem de graça em System.IO

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

No entanto, você pode também tentar "AppDomain.CurrentDomain.BaseDirector" em vez de "Server.MapPath".

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

ou

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 é a melhor solução para obter o caminho que é exatamente precisa, por agora

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top