ASP.NET MVC Web应用程序无法找到href链接

时间:2018-05-02 19:38:49

标签: html asp.net-mvc azure-web-sites

我的Azure Web应用程序中有以下HTML:

Please complete and return the 
<a href="~/Views/MyView/TermsOfService.pdf">Terms of Service</a>

.csproj文件中包含此pdf:     

当我点击&#34;启动Google Chrome&#34;在Visual Studio中本地测试,当我点击&#34;服务条款&#34;时,我收到以下错误:

enter image description here

但文件就在那里!它在我的文件系统上。没有必要的编码。为什么显示此错误以及为什么无法从Web应用程序下载PDF?我是否需要另一步来发布它?请帮忙!

1 个答案:

答案 0 :(得分:3)

默认情况下,普通请求管道不应访问 Views 文件夹的内容。 Views文件夹是视图文件(.cshtml)的主页,它将由视图引擎执行。如果查看位于~/Views内的web.config文件,您可以看到我们注册了BlockViewHandler,这会阻止对所有文件的直接文件访问。

<handlers>
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" 
                                        type="System.Web.HttpNotFoundHandler" />
</handlers>

您应该考虑将您的pdf文件移动到应用程序根目录中的Statics目录并指向该目录。

enter image description here

现在,指向该位置

<a href="~/Statics/TermsOfService.pdf">Terms of Service</a>

您可以为目录指定自己的名称。有些人喜欢将它保存在Content目录下。所以这更像是个人偏好。

在asp.net核心中,wwwroot目录默认为静态内容主目录。所以你可以将静态内容保存在其中(这是可以覆盖的)

您可以对位于views目录中的web.config进行更改以允许直接浏览,但更扎实的方法是不污染约定并将静态资源移动到它自己的文件夹。如果您绝对希望启用对视图目录的直接文件访问,则可以更新path属性值以告知mvc以防止仅访问具有特定扩展名的文件。以下是如何仅阻止.cshtml个文件(因此pdf将起作用)

<handlers>
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" 
       type="System.Web.HttpNotFoundHandler" />
</handlers>