【问题标题】:How to get the physical folder of the current view with ASP.NET MVC?ASP.NET MVC如何获取当前视图的物理文件夹?
【发布时间】:2009-12-09 18:44:17
【问题描述】:

我有一个在控制器中调用的单独的实用程序类,我需要访问 Views 文件夹中的一个文件。 Views{controller} 内部有几个包含不同视图的子文件夹。我正在寻找类似于使用的东西:

HttpContext.Current.Request.PhysicalApplicationPath

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

我尝试使用:

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

但这只是将请求的路线映射到实际不存在的物理路径(即,如果我请求“/Cars/Models/123”,它将返回“C:\AppPath\Cars\Models\123\” )

有什么想法吗?

【问题讨论】:

  • 我不确定您是否可以直接从请求路径执行此操作。请求路径映射到控制器,然后控制器可以加载任何视图,而不仅仅是来自其自己的视图子文件夹的视图。你到底想做什么?
  • 我自定义了 WebFormViewEngine,它根据加载页面的移动设备从特定子文件夹加载视图(即 iPhone 视图存储在 \Views\{controller}\iPhone\ 中)。我试图访问存储在那里的 xslt 文件。对应于不同设备视图的每个子文件夹都存储了不同的 xslt 文件。

标签: asp.net-mvc asp.net-mvc-routing


【解决方案1】:

在搞砸了 RouteValueDictionary、RouteData、RequestContext 和各种 Route 类之后,我几乎准备放弃并硬编码我的方式。我不久前开始了这个项目,所以我忘记了对 WebFormViewEngine 类的自定义我已经完成了。我将继续发布我的解决方案,即使我意识到它可能不是最优雅、最安​​全或最实用的(就最佳实践而言)。

首先我扩展了 WebFormViewEngine 类并覆盖了 FindView 方法:

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】:

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

    【讨论】:

    • 如何使用当前路由填充 RouteValueDictionary 对象?
    • RouteValueDictionary 是控制器 (RouteData) 的一个属性。您不需要填充它,它会免费填充您的路线参数。只需提取值并将它们传递给您的实用程序方法。
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2010-11-02
    • 2010-09-14
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多