首页 文章

ASP.NET MVC - 从Controller中查找App_Data文件夹的绝对路径

提问于
浏览
268

从ASP.NET MVC项目中的Controller查找App_Data文件夹的绝对路径的正确方法是什么?我希望能够临时使用.xml文件,我不想硬编码路径 .

这不起作用:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

我认为在Web上下文之外VirtualPathUtility.ToAbsolute()不起作用 . 字符串路径返回“C:\ App_Data \ somedata.xml”

我应该在哪里确定MVC应用程序中.xml文件的路径? global.asax并坚持使用应用程序级变量?

7 回答

  • 6

    Phil Haak有一个例子,我认为在使用疯狂的“\”样式目录分隔符处理路径时会更稳定一些 . 它还安全地处理路径连接 . 它在System.IO中免费提供

    var fileName = Path.GetFileName(file.FileName);
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
    

    但是,您也可以尝试“AppDomain.CurrentDomain.BaseDirector”而不是“Server.MapPath” .

  • 260
    string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");
    

    要么

    string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
    
  • 128

    ASP.NET MVC1 - > MVC3

    string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");
    

    ASP.NET MVC4

    string path = Server.MapPath("~/App_Data/somedata.xml");
    

    MSDN参考:

    HttpServerUtility.MapPath Method

  • 381
    string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
    

    这是获得它的最“正确”方式 .

  • 7

    我试图养成使用 HostingEnvironment 而不是 Server 的习惯,因为它也适用于WCF服务的上下文 .

    HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
    
  • 4

    最正确的方法是使用 HttpContext.Current.Server.MapPath("~/App_Data"); . 这意味着您只能从 HttpContext 可用的方法中检索路径 . 这是有道理的:App_Data目录是一个Web项目文件夹结构[1] .

    如果您需要从无法访问 HttpContext 的类中获取〜/ App_Data的路径,则始终可以使用IoC容器注入提供程序接口:

    public interface IAppDataPathProvider
    {
        string GetAppDataPath();
    }
    

    使用 HttpApplication 实现它:

    public class AppDataPathProvider : IAppDataPathProvider
    {
        public string GetAppDataPath()
        {
            return MyHttpApplication.GetAppDataPath();
        }
    }
    

    MyHttpApplication.GetAppDataPath 的样子:

    public class MyHttpApplication : HttpApplication
    {
        // of course you can fetch&store the value at Application_Start
        public static string GetAppDataPath()
        {
            return HttpContext.Current.Server.MapPath("~/App_Data");
        }
    }
    

    [1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx

  • 1
    string Index = i;
                string FileName = "Mutton" + Index + ".xml";
                XmlDocument xmlDoc = new XmlDocument();
    
                var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
                xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);
    

    这是获得现在最需要的路径的最佳解决方案

相关问题