Як ви запитуєте статичні файли .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.