2008-10-04 64 views
3

我试图实现一个服务器控件,该控件在ASP.NET网站的Web目录内创建了一对文件。我使用VS Web Dev Express 2008作为我的IDE。当我拨打HttpContext.Current.Request.ApplicationPath来获取Web根目录的路径,以便找到这些文件时,它会返回C :.有没有搞错?在路径中使用“〜”解析为C:

绝对路径工作得很好,但我想能够为服务器控件提供一个相对目录,并让它执行它的事情。我做错了什么?

public String Target 
{ 
    get { return _target; } 
    set 
    { 
     if (value.StartsWith("~")) 
     { 
      // WTF? Gives me C:\? Why? 
      _target = HttpContext.Current.Request.ApplicationPath + 
       value.Substring(1); 
     } 
     else 
     { 
      _target = value; 
     } 
    } 
} 

private String _target; 

protected override void Render(HtmlTextWriter writer) 
{ 
    HtmlControl wrapper = new HtmlGenericControl("div"); 
    int fileCount = 0; 

    try 
    { 
     DirectoryInfo dir = new DirectoryInfo(_target); 
     foreach (FileInfo f in dir.GetFiles()) 
     { 
      fileCount++; 
      a = new HtmlAnchor(); 
      a.Attributes.Add("href", f.FullName); 
      a.InnerHtml = f.Name; 
      wrapper.Controls.Add(a); 
     } 
    } 
    catch (IOException e) 
    { 
     throw e; 
    } 

    Controls.Add(wrapper); 
    base.Render(writer); 
} 

回答

3

这可能是因为它使用的是开发Web服务器,它只能提供硬盘上任何目录中的文件。它没有任何特定的根。你可以在IIS下运行你的项目(假设你的Windows版本支持它),并看看你是否得到相同的结果?

为了完全摆脱这个问题,您可以在web.config中硬编码想查看的路径,并解决Request.ApplicationPath返回的问题。

[编辑]

刚刚发现你可以使用

HTTPContext.Current.Request.ServerVariables("APPL_PHYSICAL_PATH") 

来回报您的应用程序的路径,在硬盘上。我很确定这就是你要找的。如果这是不正确的,请查看所有其他ServerVariables,看看你是否能得到你正在寻找的东西。

+0

不,我碰巧被XP Home弄得一团糟。没有IIS。 我最终可能会最终对该目录进行硬编码,但重点在于控件的用户能够在设计时指定目录。 – Dustman 2008-10-04 01:25:32

+0

是的,它必须是VS提供的迷你服务器......但是你会认为它会知道它从哪里获取文件。 – Dustman 2008-10-04 01:51:16