Chcę mieć możliwość żądania .html
plików statycznych , które znajdują się w ~/Views
folderze. Zgodnie z dokumentacją system routingu sprawdza, czy adres URL pasuje do pliku dyskowego przed oceną tras aplikacji.
Ale kiedy żądam pliku, 404
pojawia się błąd.
Mój plik znajduje się w folderze ~ / Views. Adres URL to:http://[localhost]/Views/HtmlPage1.html
Co przegapiłem?
źródło
Aby zezwolić na pliki takie jak js i html w folderze Widoki, edytuj plik web.config w folderze 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>
źródło
Cóż, możesz. Zaznaczona odpowiedź nie jest do końca poprawna, chociaż daje rozwiązanie.
Rozumowanie w zaznaczonej odpowiedzi jest poprawne, to web.config (konkretnie ustawienie BlockViewHandler) w folderze Widoki uniemożliwia bezpośredni dostęp do plików. Służy do zabezpieczania widoków w Asp.Net MVC. Ale jeśli zadałeś pytanie dotyczące bezpośredniego udostępniania tych plików, prawdopodobnie masz ważny powód, aby to zrobić, na przykład użycie widoków częściowych AngularJS (jak w naszym przypadku), w których nie chcemy powielać folderu widoków z dziwnymi nazwami.
Oto bardzo prosta poprawka, którą możesz wykonać w pliku web.config znajdującym się w folderze Views, bez narażania bezpieczeństwa widoków mvc asp.net. Zapewni to normalne zabezpieczenie plików .cshtml, ale pozostaw pliki .html w spokoju
Zmień to
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
--do--
<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
źródło
Inną alternatywną opcją jest wstawienie metody akcji w dowolnym wybranym kontrolerze w celu obsługi pliku html
public ActionResult MyHtml() { var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html"); return result; }
Uzyskaj dostęp do html jako http: // twoja_witryna / kontroler / MyHtml . Możesz rozszerzyć tę metodę akcji, aby zaakceptować nazwę pliku html jako metodę / parametr querystrign i renderować plik w czasie wykonywania, np. Coś takiego.
public ActionResult MyHtml(string htmlPageName) { var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html"); return result; }
źródło
Jeśli planujesz używać folderu widoku wewnętrznego, powyższe odpowiedzi powinny być najlepsze, ale ta odpowiedź może być przydatna dla użytkowników, którzy migrują do asp.net mvc core. Umieszczenie plików w katalogu wwwroot zamiast w folderze views powinno ułatwić dostęp do stron html jako localhost / myfile.html
źródło