【问题标题】:Map the physical file path in asp.net mvc在 asp.net mvc 中映射物理文件路径
【发布时间】:2011-02-19 13:36:32
【问题描述】:

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

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

但是,half way down this thread on forums.asp.net 有以下引用

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

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

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

【问题讨论】:

    标签: asp.net-mvc filepath server.mappath


    【解决方案1】:
    string filePath = Server.MapPath(Url.Content("~/Content/Xsl/"));
    

    我不同意HttpContext.Current 是“邪恶”的观点。它不是解决所有问题的锤子,但它肯定比 Session 更好。

    【讨论】:

    • 呃! Url 在哪里定义?我在引用中添加了System.Web.Mvc(和using 语句),但它仍然没有定义。
    • 这是Controller msdn.microsoft.com/en-us/library/…的属性
    【解决方案2】:

    如果您在控制器类中使用或未专门使用 WebApi,则可以使用以下替代方法:

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

    【讨论】:

      【解决方案3】:

      我会通过 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……我们使用的不够多。
      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      相关资源
      最近更新 更多