Як ви запитуєте статичні файли .html у папці ~ / Views у ASP.NET MVC?


92

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

Але коли я запитую файл, 404виникає помилка.

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

Що я пропустив?

Відповіді:


111

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

Ви не можете. У цій папці є файл web.config, який явно забороняє доступ до будь-якого файлу з нього. Якщо ви хочете мати доступ до файлів із клієнта, ці файли не слід розміщувати в Viewsпапці, що має особливе значення в ASP.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 .. але IIS повинен бути таким самим, я гадаю.
Piotr Kula

1
@bkwdesign Я впевнений, що його конфігурація, керована імітацією структури папок, зіпсувала мій обробник за замовчуванням контролерів і зробила його недоступним. Тож випробуйте цю ситуацію.
Hunter-Orionnoir

78

Щоб дозволити файли, такі як js і html, у папці Views відредагуйте web.config у папці views:

<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, щоб це працювало
Сем Сіппе

Хоча позначена відповідь містить корисну інформацію, це краща відповідь. Перевірено та працює в моєму поточному проекті.
А. Мюррей

1
А як щодо файлів css?
Леандро

Відповідь @ Даріна Димитрова дає обхідний шлях, але це слід позначити як відповідь
Кунал

31

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

Ну ти можеш. Позначена відповідь є не зовсім правильною, хоча вона дає рішення.

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

Отже, ось дуже простий твік, який ви можете зробити у файлі web.config, знайденому в папці Views, без шкоди для безпеки ваших подань mpc asp.net. Це захистить файли .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

1
@pwdst: Якщо ви використовуєте комбінацію подань з боку сторони, тоді так, можливо, буде кращим перелік окремих типів. Ми просто хочемо захистити файли .cshtml, тому ми використали це, оскільки воно трохи менш багатослівне.
Вікас

14

Інший альтернативний варіант - це вставити метод дії в будь-який потрібний контролер для обслуговування файлу html

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

Отримайте доступ до html як http: // yoursite / controller / MyHtml . Ви можете розширити цей метод дії, щоб прийняти ім'я файлу html як метод / параметр querystrign і відтворити файл під час виконання, наприклад щось подібне.

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

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.