2011-07-26 56 views
2

我被問到是否有可能阻止Content目錄作爲Asp.Net MVC 3.0應用程序中url的一部分出現。例如在當我想在內容文件夾中的子目錄查看圖像存在的網址如下:ASP.NET MVC在url中隱藏內容目錄

http://localhost:[port]/Content/sub/test.bmp 

雖然我們正在尋找如下簡單地顯示出來:

http://localhost:[port]/sub/test.bmp 

Test.bmp仍將物理存在於我們只想隱藏Content部分的服務器的Content文件夾的子目錄中。

有什麼建議嗎?我可以看到掩碼控制器但不是目錄的方法。

回答

2

解決方法如下(這僅僅是一個準系統代碼的時刻,需要進行一些清理):

添加這條路線的Global.asax:

routes.MapRoute("Content", 
       "{dir}/{file}", 
       new { controller = "Content", action = "LoadContent"}); 

添加了這個控制器來處理請求:

namespace demos 
{ 
    public class ContentController : Controller 
    { 
     public ActionResult LoadContent(string dir, string file) 
     { 
      string fileName = Server.MapPath(Url.Content("~/Content/" + dir)) 
      fileName += "\\" + file;    

      // stream file if exists  
      FileInfo info = new FileInfo(fileName); 
      if (info.Exists) 
       return File(info.OpenRead(), MimeType(fileName)); 


      // else return null - file not found 
      return null;    
     } 


     private string MimeType(string filename) 
     { 
      string mime = "application/octetstream"; 
      var extension = Path.GetExtension(filename); 
      if (extension != null) 
      { 
       RegistryKey rk = Registry.ClassesRoot.OpenSubKey(extension.ToLower()); 

       if (rk != null && rk.GetValue("Content Type") != null) 
        mime = rk.GetValue("Content Type").ToString(); 
      } 

      return mime; 
     } 
    } 
} 
+0

該路由代碼將在幾乎所有的路由之後中斷,或者被之前的默認路由中斷。 -1如果您解決了問題,我會刪除投票。 –

5

您可以編寫一個控制器操作,該操作將作爲參數指定文件名並從sub目錄提供。然後爲此控制器操作配置路由,以便通過sub/{filename}訪問。

+0

感謝Darin不幸的是sub只是一個例子,將會有數十個目錄將被包含在Content目錄中。此代碼可能會用作內容管理系統的一部分,因此內容文件夾幾乎可以包含任何內容。 – kh25

+0

@ kh25,太棒了,那麼你需要參數給你的控制器動作和下面的路線:'{dir}/{file}' –

+0

我稍後再看看這個(我目前正在研究別的東西)你是否建議在控制器中使用重定向來加載url?如果是這樣,那麼這個重定向的url就像之前一樣包含完整路徑(包括Content dir)。我是MVC的新手,所以你必須忍受我。 – kh25