在asp.net mvc中映射物理文件路径

Pha*_*rus 41 asp.net-mvc server.mappath filepath

我试图从我的ASP.Net MVC控制器中的磁盘读取XSLT文件.我正在做的是以下内容:

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

但是,在forums.asp.net这个帖子的一半,有以下引用

HttpContext.Current是邪恶的,如果你在你的mvc应用程序中的任何地方使用它,你做错了,因为你不需要它.

虽然我没有使用Current,但我想知道在MVC中确定文件的绝对物理路径的最佳方法是什么?出于某种原因(我不知道为什么!)HttpContext对我来说不合适.

在ASP.Net MVC中是否有更好的(或推荐/最佳实践)方法从磁盘读取文件?

Cra*_*ntz 75

string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));
Run Code Online (Sandbox Code Playgroud)

我不同意这个HttpContext.Current"邪恶" 的观点.对于每个问题来说,这不是锤子,但它确实比例如Session更好,它可以做得很好.

  • 它是`Controller`的属性http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.url(v=vs.108).aspx (2认同)

rai*_*r33 12

如果您在控制器类中特别使用WebApi,则可以使用以下替代方法:

HostingEnvironment.MapPath("/Content/Xsl/pubmed.xslt")
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 10

我会通过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");
    }
}
Run Code Online (Sandbox Code Playgroud)

就站点根路径而言,它可以用HostingEnvironment.ApplicationPhysicalPath静态属性表示.