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

41

我正在尝试在ASP.Net MVC控制器中从磁盘读取XSLT文件。我的做法如下:

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

然而,在forums.asp.net上的这个帖子中部,有以下引用:

HttpContext.Current很糟糕,如果你在mvc应用程序中的任何地方使用它,那么你正在做错事,因为你不需要它。

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

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

3个回答

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

我不同意HttpContext.Current是“有害的”这一观点。它不是解决所有问题的工具,但对于它可以处理得好的事情来说,肯定比Session要好。


哎呀!Url在哪里定义的啊?我已经将System.Web.Mvc添加到我的引用(和using语句)中了,但它仍然没有被定义。 - user153923
2
这是 Controller 的一个属性。http://msdn.microsoft.com/zh-cn/library/system.web.mvc.controller.url(v=vs.108).aspx - Craig Stuntz

15

如果您正在使用WebApi或者不特定于控制器类,您可以使用以下内容作为替代:

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

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");
    }
}

就网站根路径而言,可以使用HostingEnvironment.ApplicationPhysicalPath静态属性来表示。


太棒的想法!人们应该在.NET世界中更多地使用IoC(控制反转)在应用程序中...我们没有充分利用它。 - PositiveGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接