Url会导致禁止链接

时间:2014-02-12 19:09:26

标签: http url path asp.net-mvc-5

我正在使用MVC5,当我使用Path.Combine创建一个MP3文件的链接时,我得到403(禁止)。

以下是我创建链接的方式

<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

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

处理此问题的最佳方法是使用.NET中内置的应用程序根路径提供程序。我相信你见过这样的事情:

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

~指示解析器查找应用程序的根目录(无论是否是虚拟目录)并返回该路径。让我们结合使用Url.Content()帮助程序来获取一条路径,无论您在应用程序中的哪个位置使用它都会始终解析(意思是嵌套深度)。

首先,更新您的应用设置(使用〜,修复斜杠)

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

接下来,使用以下

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

请注意,我们在Url.Content的第一部分使用了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>