2010-05-14 12 views
39

Sto cercando di leggere un file XSLT dal disco nel mio controller ASP.Net MVC. Quello che sto facendo è la seguente:Mappare il percorso del file fisico in asp.net mvc

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

Tuttavia, half way down this thread on forums.asp.net c'è la seguente citazione

HttpContext.Current è male e se si utilizzare ovunque nella vostra applicazione MVC si stanno facendo qualcosa sbagliato perché tu non hai bisogno di usare lo .

Anche se non sto utilizzando Current, mi chiedo quale sia il modo migliore per determinare il percorso fisico assoluto di un file in MVC? Per qualche ragione (non so perché!) HttpContext non mi sembra giusto.

Esiste un modo migliore (o consigliato/migliore prassi) per leggere i file dal disco in ASP.Net MVC?

risposta

67
string filePath = Server.MapPath(Url.Content("~/Content/Xsl/")); 

Non sono d'accordo con l'idea che HttpContext.Current sia "malvagio". Non è il martello per ogni problema, ma è sicuramente meglio di, ad esempio, Session per cose che può fare bene.

+0

Ugh! Dove è definito 'Url'? Ho aggiunto 'System.Web.Mvc' ai miei riferimenti (e alle istruzioni' using'), ma non è ancora stato definito. – jp2code

+2

È una proprietà di 'Controller' http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.url(v=vs.108).aspx –

10

avrei il percorso principale sito iniettato nel costruttore controllore dal quadro 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"); 
    } 
} 

quanto riguarda il percorso principale sito è in questione può essere espresso con la struttura statica HostingEnvironment.ApplicationPhysicalPath.

+0

idea geniale !! Le persone dovrebbero usare sempre più IoC in applicazioni comunque nel mondo .NET ... non lo usiamo abbastanza. – PositiveGuy

8

Se stai usando WebAPI o non specificamente all'interno di una classe controller, è possibile utilizzare il seguente alternativa:

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