我如何在ASP.NET MVC 3模型中访问虚拟目录?

时间:2011-03-30 12:17:50

标签: c# asp.net-mvc asp.net-mvc-3

在Controller中,您可以轻松访问需要访问的虚拟路径,如:

Server.MapPath(@"~\App_Data\blah\blah") 

这使您可以访问AppData文件夹,但如果我想在模型中访问它们,我如何在MVC 3中访问虚拟路径?

如何在我的应用程序的模型中访问我的app_data文件夹?

3 个答案:

答案 0 :(得分:4)

如果我是你,而不是弄清楚如何访问当前的执行路径,我不会破坏我的App层并将其作为参数传递给我的模型

答案 1 :(得分:3)

您的模型不应访问它 - 让控制器提供所需的数据。

答案 2 :(得分:0)

正如Aliostad所说,你应该让Controller访问它,模型应该只保存模型数据。所以这里有两种方法可以使用控制器来访问它。

如果虚拟文件夹位于Web应用程序的根目录中。 (如果您需要进一步向下钻取,只需在路径组合中添加更多参数,直到到达文件夹位置。)

string folderPath = Server.MapPath(System.IO.Path.Combine(Request.ApplicationPath, "VirtualFolderName"));

对于更易于使用的解决方案,我为Controller类创建了一个扩展:

using System.IO;   
using System.Web.Mvc;

    namespace Extensions {
        public static class ControllerExtensions {
            public static string ResolveVirtualFolderPath(this Controller controller, string folder_name) => controller?.HttpContext?.Server?.MapPath(Path.Combine(controller?.HttpContext?.Request?.ApplicationPath, folder_name));                
    }
}

然后在Controller中输入using语句,以便访问扩展名

using static Extensions.ControllerExtensions;

然后你可以在控制器中执行此操作:

string folderPath = this.ResolveVirtualFolderPath("VirtualFolderNameHere");

你可以将扩展名分解为不使用null check运算符“?”并且如果为null,则处理每个情况,例如文件夹不存在,或者可能不允许访问位置或者您需要的任何其他内容。