41 votes

Mapper le chemin physique du fichier dans asp.net mvc

J'essaie de lire un fichier XSLT à partir du disque dans mon contrôleur ASP.Net MVC. Ce que je fais est le suivant :

string filepath = HttpContext.Request.PhysicalApplicationPath;
filepath += "/Content/Xsl/pubmed.xslt";
string xsl = System.IO.File.ReadAllText(filepath);

Cependant, à mi-chemin de ce fil de discussion sur forums.asp.net il y a la citation suivante

HttpContext.Current est diabolique et si vous l'utilisez l'utilisez n'importe où dans votre application mvc, vous vous faites quelque chose de mal parce que vous n'en avez pas besoin.

Bien que je n'utilise pas Current Je me demande quelle est la meilleure façon de déterminer le chemin physique absolu d'un fichier dans MVC ? Pour une raison quelconque (je ne sais pas pourquoi !) HttpContext ne me convient pas.

Existe-t-il une meilleure méthode (ou une méthode recommandée/meilleure pratique) pour lire les fichiers sur le disque en ASP.Net MVC ?

75voto

Craig Stuntz Points 95965
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));

Je ne suis pas d'accord avec l'idée que HttpContext.Current est "diabolique". Ce n'est pas le marteau pour tous les problèmes, mais c'est certainement mieux que, par exemple, la Session pour les choses qu'elle peut faire correctement.

15voto

raider33 Points 479

Si vous utilisez WebApi ou si vous n'êtes pas spécifiquement dans une classe de contrôleur, vous pouvez utiliser ce qui suit comme alternative :

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")

10voto

Darin Dimitrov Points 528142

Je voudrais que le chemin de la racine du site soit injecté dans le constructeur du contrôleur par le cadre DI :

public class HomeController: Controller
{
    private readonly string _siteRoot;
    public HomeController(string siteRoot)
    {
        _siteRoot = siteRoot;
    }

    public ActionResult Index()
    {
        string filePath = Path.Combine(_siteRoot, @"Content\Xsl\pubmed.xslt");
        return File(filePath, "text/xml");
    }
}

En ce qui concerne le chemin d'accès à la racine du site, il peut être exprimé à l'aide de la balise HostingEnvironment.ApplicationPhysicalPath propriété statique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X