你如何在ASP.NET MVC中的〜/ Views文件夹下请求静态.html文件?

ale*_*nov 89 asp.net-mvc asp.net-mvc-routing

我希望能够请求.html位于该~/Views文件夹中的静态文件.根据文档,路由系统在评估应用程序的路由之前检查URL是否与磁盘文件匹配.

但是当我请求文件时出现404错误.

我的文件位于〜/ Views文件夹中.URL是:http://[localhost]/Views/HtmlPage1.html

我错过了什么?

Dar*_*rov 106

我希望能够请求位于'〜/ Views'文件夹中的静态.html文件.

你不能.此文件夹中有一个web.config文件,它明确禁止从中访问任何文件.如果您希望能够从客户端访问文件,则不应将这些文件放在ViewsASP.NET MVC中具有特殊含义的文件夹中.

您可以在一个~/Static文件夹中放置HTML文件.然后像这样访问它:

http://example.com/yourapplicationname/static/foo.html
Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以模仿在Views文件夹中找到的控制器名称结构,而不是命名您的文件夹'static',因此URL具有相同的"外观".例如,因为你不能在view/Order/Edit.html中放置你的plainjane*Edit.html* - 你把它放在〜/ Order/Edit.html中 (4认同)
  • 现在已经改变了最新的ASP.NET(vNext),您可以在其中为html文件注册静态提供程序,但仍然可以路由正常的MVC方式.只是快速玩它,但这是我对测试项目所做的.在Linux上运行kestrel ..但我认为IIS应该是相同的. (2认同)

小智 74

要在Views文件夹中允许像js和html这样的文件,请编辑views-Folder中的web.config:

<system.webServer>
<handlers>
  <add name="JavaScriptHandler" path="*.js" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />      
  <add name="HtmlScriptHandler" path="*.html" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
Run Code Online (Sandbox Code Playgroud)


Vik*_*kas 31

我希望能够请求位于〜/ Views文件夹中的静态.html文件.

嗯,你可以.明确的答案并不完全正确,尽管它给出了解决方案.

标记答案中的推理是正确的,它是Views文件夹中的web.config(BlockViewHandler设置具体),可防止直接访问文件.它可以保护Asp.Net MVC中的视图.但是如果你问一个关于直接提供这些文件的问题,那么你可能有正当理由这样做,比如使用AngularJS部分视图(如我们的例子),我们不希望用奇怪的名称复制views文件夹.

所以这里是一个非常简单的调整,您可以在Views文件夹中找到的web.config文件中进行,而不会影响您的asp.net mvc视图的安全性.这将像往常一样保护.cshtml文件,但保留.html文件.A

改变这个

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"    type="System.Web.HttpNotFoundHandler" />
Run Code Online (Sandbox Code Playgroud)

- 至 -

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Run Code Online (Sandbox Code Playgroud)

  • 对于其他文件(如.aspx或.ascx文件或来自第三方视图引擎的文件),这可能仍然很危险.根据cs3x的答案,白名单要好得多. (3认同)

Ven*_*ndi 14

另一个备选方案是在任何所需的控制器中插入一个动作方法来提供html文件

public ActionResult MyHtml()
{
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;
}
Run Code Online (Sandbox Code Playgroud)

访问html为http:// yoursite/controller/MyHtml.您可以扩展此操作方法以接受html文件名作为方法/ querystrign参数并在运行时呈现文件,例如,像这样.

 public ActionResult MyHtml(string htmlPageName)
 {
      var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
      return result;
 }
Run Code Online (Sandbox Code Playgroud)