Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使用ASP.NET MVC获取当前视图的物理文件夹?_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

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

Asp.net mvc 如何使用ASP.NET MVC获取当前视图的物理文件夹?,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我有一个单独的实用程序类,它在控制器中调用,我需要访问Views文件夹中的一个文件。在视图{controller}中有两个子文件夹,其中包含不同的视图。我想要的是类似于使用: HttpContext.Current.Request.PhysicalApplicationPath 获取驱动器上的物理文件夹 我尝试使用: HttpContext.Current.Request.MapPath(HttpContext.Current.Request.Path); 但这只是将请求的路由映射到实际不存

我有一个单独的实用程序类,它在控制器中调用,我需要访问Views文件夹中的一个文件。在视图{controller}中有两个子文件夹,其中包含不同的视图。我想要的是类似于使用:

HttpContext.Current.Request.PhysicalApplicationPath
获取驱动器上的物理文件夹

我尝试使用:

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


有什么想法吗?

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

在搞乱了RouteValueDictionary、RouteData、RequestContext和各种路由类之后,我几乎准备放弃,硬编码进入。我不久前开始了这个项目,所以我忘记了我对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);
宾果

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


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

我不确定您是否可以直接从请求路径执行此操作。请求路径映射到控制器,然后控制器可以加载任何视图,而不仅仅是从其自己的视图子文件夹加载的视图。你到底想做什么?我定制了WebFormViewEngine,它根据加载页面的移动设备从特定子文件夹加载视图(即iPhone视图存储在\views\{controller}\iPhone\中)。我试图访问存储在那里的xslt文件。对应于不同设备视图的每个子文件夹都存储了不同的xslt文件。如何使用当前路由填充RouteValueDictionary对象?RouteValueDictionary是控制器(RouteData)的属性。您不需要填充它,它会免费填充您的路线参数。只需提取值并将其传递到实用程序方法。