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

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

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

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

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

6 ответов

Решение

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

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

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

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

Чтобы разрешить такие файлы, как js и html в папке Views, отредактируйте файл web.config в views-Folder:

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

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

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

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

Итак, вот очень простая настройка, которую вы можете сделать в файле web.config, находящемся в папке Views, без ущерба для безопасности ваших представлений asp.net mvc. Это защитит файлы.cshtml как обычно, но оставит ваши файлы.html в покое.

Изменить это

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

--to--

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

Другой альтернативный вариант - вставить метод действия в любой из желаемых контроллеров для обслуживания 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;
 }

Если вы планируете использовать внутреннюю папку просмотра, приведенные выше ответы должны быть наилучшими, но этот ответ может быть полезен для пользователей, которые переходят на ядро ​​asp.net mvc. Размещение файлов в wwwroot вместо папки views должно облегчить доступ к вашим html-страницам как localhost/myfile.html

Вы можете поместить его в папку /Content.

Другие вопросы по тегам