在Controller中,您可以轻松访问需要访问的虚拟路径,如:
Server.MapPath(@"~\App_Data\blah\blah")
这使您可以访问AppData文件夹,但如果我想在模型中访问它们,我如何在MVC 3中访问虚拟路径?
如何在我的应用程序的模型中访问我的app_data文件夹?
答案 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,则处理每个情况,例如文件夹不存在,或者可能不允许访问位置或者您需要的任何其他内容。