Как вы запрашиваете статические .html файлы в папке ~/Views в ASP.NET MVC?

Я хочу иметь возможность запрашивать статические файлы .html, которые находятся в папке ~/Views. Согласно документации, система маршрутизации проверяет, соответствует ли URL-адрес файлу диска перед оценкой маршрутов приложения.

Но когда я запрашиваю файл, возникает ошибка 404.

Мой файл находится в папке ~/Views. URL-адрес: http://[localhost]/Views/HtmlPage1.html

Что я пропустил?

Ответ 1

Я хочу иметь возможность запрашивать статические .html файлы, которые находятся в папке ~ ~/Views.

Вы не можете. В этой папке есть файл web.config, который явно запрещает доступ к нему из любого файла. Если вы хотите иметь доступ к файлам с клиента, эти файлы не должны помещаться в папку Views, которая имеет особое значение в ASP.NET MVC.

У вас может быть папка ~/Static, где вы можете разместить ваши HTML файлы. И затем войдите в него так:

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

Ответ 2

Чтобы разрешить такие файлы, как 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>

Ответ 3

Я хочу иметь возможность запрашивать статические .html файлы, которые находятся в папка ~/Views.

Хорошо. Отмеченный ответ не совсем корректен, хотя он дает решение.

Приведенные аргументы в правильном ответе правильны: в папке "Представления", которая запрещает доступ к файлам напрямую, устанавливается web.config(параметр BlockViewHandler). Он предназначен для защиты представлений в Asp.Net MVC. Но если вы задали вопрос об обслуживании этих файлов напрямую, то у вас, вероятно, есть веские основания для этого, например, использовать частичные представления AngularJS (как в нашем случае), где мы не хотим дублировать папку представлений со странными именами.

Итак, вот очень простая настройка, которую вы можете сделать в файле 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" />

Ответ 4

Другой альтернативный вариант заключается в том, чтобы вставить метод действия в любой из требуемых контроллеров, чтобы обслуживать html файл

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

Доступ к html как http://yoursite/controller/MyHtml. Вы можете расширить этот метод действий, чтобы принять имя файла html в качестве параметра method/querystrign и отобразить файл во время выполнения, например, что-то вроде этого.

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