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


92

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

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

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

我错过了什么?

Answers:


111

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

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

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

http://example.com/yourapplicationname/static/foo.html

4
或者,您可以模仿在Views文件夹中找到的控制器名称结构,而不是将文件夹命名为“静态”。因此,URL具有相同的“外观”。例如,由于您不能将Plainjane Edit.html放入Views / Order / Edit.html中-您将其放入〜/ Order / Edit.html
bkwdesign

2
现在,最新的ASP.NET(vNext)改变了这一点,您可以在其中注册html文件的静态提供程序,但仍然可以使用常规的MVC方式进行路由。只是快速玩过,但这就是我在测试项目中所做的。在Linux上通过茶est运行..但是IIS应该与我想的相同。
Piotr Kula 2015年

1
@bkwdesign我敢肯定,通过模仿文件夹结构来控制其配置会弄乱我的控制器的默认处理程序,并使其无法访问。所以测试一下这种情况。
Hunter-Orionnoir,2015年

78

要在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>


1
我必须删除“ routes.RouteExistingFiles = true;”行。在RouteConfig.RegisterRoutes中可以正常工作
Sam Sippe 2015年

虽然标记的答案包含有用的信息,但这是更好的答案。经过测试并在我当前的项目中工作。
A. Murray

1
那css文件呢?
Leandro

@Darin Dimitrov的答案给出了一种解决方法,但是应将其标记为答案
Kunal

31

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

好吧,你可以。标记的答案虽然可以提供解决方案,但并不完全正确。

标记答案中的理由是正确的,因为它是Views文件夹中的web.config(特定于BlockViewHandler设置),它阻止直接访问文件。它在那里可以保护Asp.Net MVC中的视图。但是,如果您问到有关直接提供这些文件的问题,那么您可能有充分的理由这样做,例如使用AngularJS部分视图(如本例所示),在该视图中我们不想使用奇怪的名称复制views文件夹。

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

改变这个

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

- 至 -

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

3
对于其他文件,例如.aspx或.ascx文件或来自第三方视图引擎的文件,这仍然可能很危险。根据cs3x的答案将其列入白名单要好得多。
pwdst 2014年

1
@pwdst:如果混合使用服务器侧视图,则可以将单个类型列入白名单可能会更好。我们只想保护.cshtml文件,所以我们使用它是因为它不太冗长。
维卡斯2014年

14

另一个替代方法是在任何所需的控制器中插入一个操作方法以提供html文件

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

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

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

0

如果您打算使用内部视图文件夹,则上面的答案应该是最好的,但是对于正在迁移到asp.net mvc core的用户而言,此答案可能很有用。将文件放置在wwwroot而不是views文件夹中,应使您的html页面作为localhost / myfile.html轻松访问

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.