2008-10-04 62 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