我正在使用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.AlbumName
和song.Name
中包含空格,“文件”文件夹作为项目的一部分包含在Content
文件夹中。
生成的链接看起来像这样(虽然它确实得到了url编码)
http://localhost:49563/..\Content\Files\Mixtapes\Album Name\Song Name.mp3
如何解决这个问题?
答案 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>