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

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 的 ~/Views 文件夹下请求静态 .html 文件?【英文标题】:How do you request static .html files under the ~/Views folder in ASP.NET MVC? 【发布时间】:2013-07-30 17:50:54 【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

【参考方案1】:

如果您打算使用内部视图文件夹,以上答案应该是最好的,但此答案可能对迁移到 asp.net mvc 核心的用户有用。将文件放在 wwwroot 而不是 views 文件夹中应该可以让您的 html 页面以 localhost/myfile.html 的方式轻松访问

【讨论】:

【参考方案2】:

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

public ActionResult MyHtml()

    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;

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

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

【讨论】:

【参考方案3】:

要允许视图文件夹中的 js 和 html 等文件编辑视图文件夹中的 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>

【讨论】:

我必须删除行“routes.RouteExistingFiles = true;”在 RouteConfig.RegisterRoutes 中使其工作 虽然标记的答案包含有用的信息,但这是更好的答案。在我当前的项目中测试和工作。 css文件呢? @Darin Dimitrov 的回答给出了一个解决方法,但这应该被标记为答案【参考方案4】:

我希望能够请求位于 ~/Views 文件夹。

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

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

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

改变这个

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

--到--

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

【讨论】:

这对于其他文件(如 .aspx 或 .ascx 文件)或来自第三方视图引擎的文件仍然可能很危险。根据 cs3x 的回答,将其列入白名单要好得多。 @pwdst:如果您使用混合服务器端视图,那么将单个类型列入白名单可能会更好。我们只是想保护 .cshtml 文件,所以我们使用它,因为它不那么冗长。【参考方案5】:

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

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

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

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

【讨论】:

或者,您可以模仿 Views 文件夹中的控制器名称结构,而不是将文件夹命名为“静态”。因此 URL 具有相同的“外观”。例如。因为你不能把你的plainjane Edit.html 放在 Views/Order/Edit.html - 你把它放在 ~/Order/Edit.html 这已经随着最新的 ASP.NET (vNext) 发生了变化,您可以在其中为 html 文件注册静态提供程序,但仍然可以通过正常的 MVC 方式进行路由。只是快速玩了一下,但这就是我对测试项目所做的。在 Linux 上通过 kestrel 运行.. 但我想 IIS 应该是一样的。 @bkwdesign 我确信通过模仿文件夹结构来控制它的配置会弄乱我的控制器默认处理程序并使其无法访问。所以测试一下这种情况。

以上是关于如何在 ASP.NET MVC 的 ~/Views 文件夹下请求静态 .html 文件?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 中 要 访问/ Views/Admin/Order/Index.aspx页面 在 路由里该如何设置?

Asp.net MVC 视图

ASP.NET中的MVC如何使用?

ASP.NET中的MVC如何使用?

如何使用 Asp.net MVC 从页面引用位于视图文件夹中的 .js 文件

ASP NET MVC 4 Razor Views 预编译花费大量时间