2010-05-14 15 views
39

Estoy tratando de leer un archivo XSLT desde el disco en mi controlador de ASP.Net MVC. Lo que estoy haciendo es el siguiente:mapa la ruta del archivo físico en asp.net mvc

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

Sin embargo, hay half way down this thread on forums.asp.net la siguiente cita

HttpContext.Current es malo y si utilizarlo en cualquier lugar en su aplicación MVC que están haciendo algo mal porque no lo necesita.

Si bien no estoy usando Current, me pregunto cuál es la mejor manera de determinar la ruta física absoluta de un archivo en MVC? Por alguna razón (no sé por qué!) HttpContext no se siente bien para mí.

¿Hay un (mejor o recomendada/práctica) mejor manera de leer archivos del disco en ASP.Net MVC?

Respuesta

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

No estoy de acuerdo con la idea de que HttpContext.Current es "malvado". No es el martillo para cada problema, pero sin duda es mejor que, por ejemplo, Sesión para cosas que puede hacer bien.

+0

Uf! ¿Dónde se define 'Url'? Añadí 'System.Web.Mvc' a mis referencias (y' declaraciones using'), pero aún no está definido. – jp2code

+2

Es una propiedad de 'controlador' http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.url(v=vs.108).aspx –

10

que tendría la ruta raíz del sitio inyectado en el constructor controlador por el marco 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 cuanto a la ruta de raíz del sitio se refiere se puede expresar con la propiedad estática HostingEnvironment.ApplicationPhysicalPath.

+0

idea genial !! La gente debería usar más IoC en todas las aplicaciones en el mundo .NET ... no lo usamos lo suficiente. – PositiveGuy

8

Si está utilizando WebAPI o no específicamente dentro de una clase de controlador, puede utilizar el siguiente como alternativa:

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