代码之家  ›  专栏  ›  技术社区  ›  prototypef

如何使用ASP.NET MVC获取当前视图的物理文件夹?

  •  2
  • prototypef  · 技术社区  · 15 年前

    HttpContext.Current.Request.PhysicalApplicationPath
    

    获取驱动器上的物理文件夹。

    我尝试使用:

    HttpContext.Current.Request.MapPath(HttpContext.Current.Request.Path);
    

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   prototypef    15 年前

    在搞乱了RouteValueDictionary、RouteData、RequestContext和各种路由类之后,我几乎准备放弃,硬编码进入。我不久前开始了这个项目,所以我忘记了我对WebFormViewEngine类所做的定制。我将继续发布我的解决方案,尽管我意识到它可能不是最优雅、最安全或最实用的(就最佳实践而言)。

    public class CustomViewEngine : WebFormViewEngine
    {
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
     {
      ViewEngineResult result = null;
      var request = controllerContext.HttpContext.Request;
    
      // modify stuff here
    
      result = base.FindView(controllerContext, viewName, masterName, useCache);
    
      return result;
     }
    }
    

    我所做的是向我的实用程序类添加一个静态属性,如下所示:

    public static string CurrentViewPath { get; set; }
    

    并修改FindView方法以捕获ViewEngineResult并获取ViewPath:

    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
      ViewEngineResult result = null;
      var request = controllerContext.HttpContext.Request;
    
      // modify stuff here
    
      result = base.FindView(controllerContext, viewName, masterName, useCache);
    
      System.Web.Mvc.WebFormView wfvView = (System.Web.Mvc.WebFormView)result.View;
      HelperFunctions.CurrentViewPath = wfvView.ViewPath.Replace(viewName + ".aspx","");
    
      return result;
    }
    

    这给了我视图的虚拟路径,这正是我所需要的。剩下要做的唯一一件事就是返回实用程序类,并使用HttpContext.Current.Request.MapPath方法获取当前视图文件所在位置的完整物理路径:

    string ViewPath = HttpContext.Current.Request.MapPath(CurrentViewPath);
    

    宾果!

    这是一种迂回的黑客方式来做到这一点,但嘿,如果它的工作。。。

    谢谢大家的帮助和有用的建议。

        2
  •  0
  •   tvanfosson    15 年前

    该框架是自以为是的,所以我会使用与该框架相同的搜索算法。找到应用程序的根目录,然后查看“视图”文件夹。它应该位于与相关控制器关联的文件夹或共享文件夹中。使用RouteValueDictionary访问控制器。