2014-02-12 66 views
0

我使用的是MVC5,當我使用Path.Combine創建一個到MP3文件的鏈接時,我得到一個403(禁止)。Url導致禁止鏈接

下面是如何創建

<a href="@Path.Combine(SiteConfiguration.ContentPath, SiteConfiguration.AlbumsPath, Model.AlbumName, song.Name)" >@song.Name</a> 

這裏是變量

<add key="ContentPath" value="..\Content\Files\" /> 
<add key="AlbumsPath" value="Mixtapes\" /> 

Model.AlbumNamesong.Name在他們和文件夾空間的值是作爲該項目的一部分,鏈接Content文件夾。

鏈接生成這個樣子的(儘管它得到URL編碼)

http://localhost:49563/..\Content\Files\Mixtapes\Album Name\Song Name.mp3 

這又如何解決?

+0

這可能很簡單,但你確定這些文件實際上有正確的權限來檢索以這種方式? – admdrew

回答

1

處理此問題的最佳方法是使用.NET中內置的應用程序根路徑提供程序。我相信你已經看到了這樣的事情:

@Url.Content("~/Content/Images/image.jpg") 

~指示解析器去尋找應用程序的根(虛擬目錄或不是否),並返回該路徑。讓我們結合使用Url.Content()助手來獲得一條路徑,該路徑將永遠解決,無論您使用它的應用程序中的哪個位置(即嵌套深度)。

首先,更新您的應用程序設置(使用〜,解決您的斜槓)

<add key="ContentPath" value="~/Content/Files" /> 
<add key="AlbumsPath" value="Mixtapes" /> 

接下來,我們在使用Url.Content以下

<a href="@Path.Combine(Url.Content(SiteConfiguration.AppSettings["ContentPath"]), 
SiteConfiguration.AppSettings["AlbumsPath"], Model.AlbumName, song.Name)" >@song.Name</a> 

公告更新<a>標籤第一部分Path.Combine。這將會給你帶來什麼,你可以在你的應用程序的任何地方使用這種格式,該框架將解析~並給你適當的根鏈接。您只需要爲ContentPath變量執行此操作,因爲它爲您提供了要查找的目錄的根目錄。一點點更多的輸入,一個更好的結果(從我下面的測試項目)

http://localhost:60306/Content/Files/Mixtapes/Test/Song%20Title 

最後一個念頭,如果你正在使用這些值不夠,你分解其中的部分分離出來的AppSettings的,也許你應該創建自己的Url助手,它需要兩個參數並返回正確的Url。所以,而不是上述,你可以簡單地使用

<a href="@Url.GenerateSongLink(Model.AlbumName, song.Name)">song.Title</a>