2013-07-30 12 views
72

Chcę móc żądać statycznych .html plików, które znajdują się w folderze ~/Views. Zgodnie z dokumentacją system routingu sprawdza, czy adres URL pasuje do pliku dysku przed oceną tras aplikacji.Jak żądać statycznych plików .html w folderze ~/Views w ASP.NET MVC?

Ale kiedy zwrócić się do pliku pojawia się błąd 404.

Mój plik znajduje się w katalogu ~/widoki. Adres URL: http://[localhost]/Views/HtmlPage1.html

Co przeoczyłem?

Odpowiedz

85

Chcę mieć możliwość żądania statycznych plików .html, które znajdują się w folderze "~/Views".

Nie możesz. W tym folderze znajduje się plik web.config, który jawnie zabrania dostępu do dowolnego pliku z niego. Jeśli chcesz mieć dostęp do plików od klienta, pliki te nie powinny być umieszczane w folderze Views, który ma specjalne znaczenie w ASP.NET MVC.

Można mieć ~/Static folder, w którym można umieszczać pliki HTML. A następnie dostęp do niego tak:

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

Zamiast nazywać folder "statyczny", można naśladować strukturę nazwy kontrolera, która znajduje się w folderze Widoki. Adres URL ma ten sam "wygląd". Na przykład. ponieważ nie możesz umieścić swojej zwykłej edycji * Edit.html * w Widokach/Zamów/Edycja.html - umieścisz ją w ~/Order/Edit.html – bkwdesign

+2

To teraz zmieniło się z ostatnim ASP.NET (vNext), gdzie możesz zarejestruj dostawcę statycznego dla plików html, ale nadal kieruj normalnym sposobem MVC. Miałem tylko szybką grę, ale to właśnie zrobiłem z projektem testowym. Przebiegnięcie przez pustułkę w Linuksie ... ale IIS powinien być taki sam, jak przypuszczam. – ppumkin

+1

@bkwdesign Jestem pewien, że jego konfiguracja kontrolowana przez naśladowanie struktury folderów zawiodła mój domyślny program obsługi kontrolerów i uniemożliwiła dostęp do nich. Przetestuj tę sytuację. –

29

Chcę móc żądać statycznych plików .html, które znajdują się w do folderu ~/widoki.

Cóż można. Zaznaczona odpowiedź nie jest całkowicie poprawna, mimo że daje rozwiązanie.

Uzasadnienie w zaznaczonej odpowiedzi jest poprawne, jest to web.config (ustawienie BlockViewHandler jest specyficzne) w folderze Views, który uniemożliwia bezpośredni dostęp do plików. Jest tam do zabezpieczania widoków w Asp.Net MVC. Ale jeśli zadałeś pytanie dotyczące serwowania tych plików bezpośrednio, prawdopodobnie masz do tego ważny powód, na przykład używając częściowych widoków AngularJS (jak w naszym przypadku), w których nie chcemy duplikować folderu widoków o dziwnych nazwach.

Więc tutaj jest bardzo prosty uszczypnąć można zrobić w pliku web.config znaleziony w folderze Widoki bez narażania bezpieczeństwa swojego ASP.NET MVC widoki. Pozwoli to zabezpieczyć .cshtml plików jak zwykle, ale zostawić .html plików alone.A

zmienić tę

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

--to--

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

Może to być nadal niebezpieczne w przypadku innych plików, takich jak pliki .aspx lub .ascx, lub te z silników stron trzecich. Znacznie lepiej jest dodać do białej listy, jak na odpowiedź cs3x. – pwdst

+1

@pwdst: Jeśli korzystasz z różnych widoków po stronie serwera, to tak, aby wszystkie typy na białej liście mogły być lepsze. Chcemy tylko chronić pliki .cshtml, więc użyliśmy tego, ponieważ jest trochę mniej gadatliwy. – Vikas

59

Aby umożliwić jak pliki js i html w folderze widoki edycji web.config w widokach-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> 

+7

+ punkty ciasteczka dla Kermit –

+0

Musiałem usunąć linię "routes.RouteExistingFiles = true;" w RouteConfig.RegisterRoutes do tego działa –

+0

Podczas gdy zaznaczona odpowiedź zawiera przydatne informacje, jest to lepsza odpowiedź. Przetestowany i działający w moim bieżącym projekcie. –

9

Inną możliwością jest dodanie na przemian metody działania dowolnego żądanego sterownika służyć plik HTML

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

w formacie HTML jak http://yoursite/controller/MyHtml.Możesz rozszerzyć tę metodę działania, aby zaakceptować nazwę pliku html jako parametr/querystrign i renderować plik w czasie wykonywania, np. Coś takiego.

Powiązane problemy