Bagaimana Anda meminta file .html statis di bawah folder ~ / Views di ASP.NET MVC?

92

Saya ingin dapat meminta .htmlfile statis yang terletak di ~/Viewsfolder tersebut. Menurut dokumentasi, sistem perutean memeriksa untuk melihat apakah URL cocok dengan file disk sebelum mengevaluasi rute aplikasi.

Tetapi ketika saya meminta file, 404kesalahan muncul.

File saya terletak di folder ~ / Views. URL-nya adalah:http://[localhost]/Views/HtmlPage1.html

Apa yang saya lewatkan?

alex.mironov
sumber

Jawaban:

111

Saya ingin dapat meminta file .html statis yang terletak di folder '~ / Views'.

Tidak boleh. Ada file web.config di folder ini yang secara eksplisit melarang mengakses file apa pun darinya. Jika Anda ingin dapat mengakses file dari klien, file tersebut tidak boleh ditempatkan di Viewsfolder yang memiliki arti khusus di ASP.NET MVC.

Anda bisa memiliki ~/Staticfolder tempat Anda bisa meletakkan file HTML Anda. Dan kemudian akses seperti itu:

http://example.com/yourapplicationname/static/foo.html
Darin Dimitrov
sumber
4
Atau, alih-alih menamai folder Anda 'statis', Anda dapat meniru struktur nama pengontrol yang ditemukan di dalam folder Views .. sehingga URL memiliki 'tampilan' yang sama. Misalnya, karena Anda tidak dapat meletakkan Plainjane Edit.html Anda di Views / Order / Edit.html - Anda memasukkannya ke ~ / Order / Edit.html
bkwdesign
2
Ini sekarang telah berubah dengan ASP.NET (vNext) terbaru di mana Anda dapat mendaftarkan penyedia statis untuk file html tetapi juga masih merutekan cara MVC normal. Hanya bermain cepat dengannya tetapi itulah yang saya lakukan dengan proyek uji. Berjalan melalui kestrel di Linux .. tetapi IIS harus sama saya kira.
Piotr Kula
1
@bkwdesign Saya yakin konfigurasinya dikontrol dengan meniru struktur folder yang mengacaukan penangan default pengontrol saya dan membuatnya tidak dapat diakses. Jadi uji situasi ini.
Hunter-Orionnoir
78

Untuk mengizinkan file seperti js dan html di folder Views, edit web.config di 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>

cs3x
sumber
1
Saya harus menghapus baris "routes.RouteExistingFiles = true;" di RouteConfig.RegisterRoutes agar ini berfungsi
Sam Sippe
Meskipun jawaban yang ditandai berisi informasi yang berguna, ini adalah jawaban yang lebih baik. Diuji dan bekerja dalam proyek saya saat ini.
A. Murray
1
Bagaimana dengan file css?
Leandro
Jawaban @Darin Dimitrov memberikan solusi, tetapi ini harus ditandai sebagai jawabannya
Kunal
31

Saya ingin dapat meminta file .html statis yang terletak di folder ~ / Views.

Anda bisa. Jawaban yang ditandai tidak sepenuhnya benar, meskipun memberikan solusi.

Alasan di jawaban yang ditandai benar, itu adalah web.config (pengaturan BlockViewHandler untuk lebih spesifik) di folder Views yang mencegah file untuk diakses secara langsung. Itu ada untuk mengamankan pandangan di Asp.Net MVC. Tetapi jika Anda mengajukan pertanyaan tentang menyajikan file-file ini secara langsung maka Anda mungkin memiliki alasan yang valid untuk melakukannya, seperti menggunakan tampilan parsial AngularJS (seperti dalam kasus kami) di mana kami tidak ingin menduplikasi folder tampilan dengan nama yang aneh.

Jadi di sini adalah tweak yang sangat sederhana yang dapat Anda lakukan di file web.config yang ditemukan di folder Views, tanpa mengorbankan keamanan tampilan mvc asp.net Anda. Ini akan mengamankan file .cshtml seperti biasa tetapi membiarkan file .html Anda sendiri

Ubah ini

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

--untuk--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Vikas
sumber
3
Ini masih bisa berbahaya dengan file lain seperti file .aspx atau .ascx atau yang dari mesin tampilan pihak ketiga. Jauh lebih baik untuk memasukkan ke daftar putih sesuai jawaban cs3x.
pwdst
1
@pwdst: Jika Anda menggunakan campuran tampilan sisi server, maka memasukkan jenis individu ke daftar putih mungkin lebih baik. Kami hanya ingin melindungi file .cshtml jadi kami menggunakan ini karena ini sedikit kurang bertele-tele.
Vikas
14

Opsi alternatif lainnya adalah memasukkan metode tindakan di salah satu pengontrol yang diinginkan untuk menyajikan file html

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

Akses html sebagai http: // yoursite / controller / MyHtml . Anda dapat memperluas metode tindakan ini untuk menerima nama file html sebagai parameter metode / querystrign dan membuat file tersebut pada waktu proses, misalnya sesuatu seperti ini.

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

Jika Anda berencana menggunakan folder tampilan dalam, jawaban di atas seharusnya yang terbaik tetapi jawaban ini mungkin berguna bagi pengguna yang bermigrasi ke inti mvc asp.net. Menempatkan file di wwwroot alih-alih folder views seharusnya membuat halaman html Anda mudah diakses sebagai localhost / myfile.html

Kurkula
sumber