Как запрашивать статические файлы.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