ASP.NET MVC'de ~ / Views klasörü altında statik .html dosyalarını nasıl talep edersiniz?


93

Klasörde .htmlbulunan statik dosyaları talep edebilmek istiyorum ~/Views. Belgelere göre, yönlendirme sistemi, uygulamanın yollarını değerlendirmeden önce bir URL'nin bir disk dosyasıyla eşleşip eşleşmediğini kontrol eder.

Ancak dosyayı istediğimde bir 404hata ortaya çıkıyor.

Dosyam ~ / Views klasöründe bulunuyor. URL:http://[localhost]/Views/HtmlPage1.html

Neyi özledim?

Yanıtlar:


111

'~ / Views' klasöründe bulunan statik .html dosyalarını isteyebilmek istiyorum.

Yapamazsın. Bu klasörde, içindeki herhangi bir dosyaya erişmeyi açıkça yasaklayan bir web.config dosyası vardır. İstemciden dosyalara erişebilmek istiyorsanız, bu dosyalar ViewsASP.NET MVC'de özel bir anlamı olan klasöre yerleştirilmemelidir .

~/StaticHTML dosyalarınızı yerleştirebileceğiniz bir klasörünüz olabilir. Ve sonra ona şu şekilde erişin:

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

4
Veya, klasörünüzü 'statik' olarak adlandırmak yerine, Görünümler klasöründe bulunan denetleyici adı yapısını taklit edebilirsiniz .. böylece URL aynı 'görünüme' sahip olur. Örneğin, plainjane Edit.html dosyanızı Views / Order / Edit.html içine koyamadığınız için - ~ / Order / Edit.html içine koyarsınız
bkwdesign

2
Bu, artık html dosyaları için statik sağlayıcı kaydedebileceğiniz ancak yine de normal MVC yolunu yönlendirebileceğiniz en son ASP.NET (vNext) ile değişti. Sadece hızlı bir oyun oynadım ama bir test projesinde yaptığım buydu. Linux'ta kestrel üzerinden çalışıyor .. ama sanırım IIS aynı olmalı.
Piotr Kula

1
@bkwdesign Klasör yapısını taklit ederek kontrol edilen yapılandırmasının denetleyicilerimin varsayılan işleyicisini karıştırdığından ve erişilemez hale getirdiğinden eminim. Bu durumu test edin.
Hunter-Orionnoir

78

Görünümler klasöründe js ve html gibi dosyalara izin vermek için web.config dosyasını views-Klasöründe düzenleyin:

<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
"Route.RouteExistingFiles = true;" satırını kaldırmak zorunda kaldım. in RouteConfig.Register Bunun çalışması için
rotalar

İşaretli cevap faydalı bilgiler içermekle birlikte, bu daha iyi cevaptır. Mevcut projemde test edildi ve çalışıyor.
A. Murray

1
Peki ya css dosyaları?
Leandro

@Darin Dimitrov'un cevabı bir geçici çözüm sunar, ancak bu cevap olarak işaretlenmelidir
Kunal

31

~ / Views klasöründe bulunan statik .html dosyalarını isteyebilmek istiyorum.

Yapabilirsin. İşaretli cevap, bir çözüm sağlasa da tamamen doğru değildir.

İşaretli yanıttaki mantık doğrudur, dosyalara doğrudan erişilmesini engelleyen Görünümler klasöründeki web.config'dir (BlockViewHandler ayarı özeldir). Asp.Net MVC'deki görünümleri güvence altına almak için var. Ancak, bu dosyaların doğrudan sunulması hakkında bir soru sorduysanız, görünümler klasörünü garip adlarla çoğaltmak istemediğimiz AngularJS kısmi görünümlerini (bizim durumumuzda olduğu gibi) kullanmak gibi, bunu yapmak için muhtemelen geçerli bir nedeniniz vardır.

İşte görünümler klasöründe bulunan web.config dosyasında, asp.net mvc görünümlerinizin güvenliğinden ödün vermeden yapabileceğiniz çok basit bir ince ayar. Bu, .cshtml dosyalarının her zamanki gibi güvenliğini sağlar ancak .html dosyalarınızı olduğu gibi bırakmaz.

Bunu değiştir

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

--to--

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

3
Bu, .aspx veya .ascx dosyaları veya üçüncü taraf görünüm motorlarından gelen dosyalar gibi diğer dosyalar için hala tehlikeli olabilir. CS3x'in cevabına göre beyaz listeye almak çok daha iyi.
pwdst

1
@pwdst: Sunucu tarafı görünümlerinin bir karışımını kullanıyorsanız evet, tek tek türleri beyaz listeye eklemek daha iyi olabilir. Biz sadece .cshtml dosyalarını korumak istiyoruz, bu yüzden bunu biraz daha az ayrıntılı olduğu için kullandık.
Vikas

14

Diğer bir alternatif seçenek, html dosyasını sunmak için istenen denetleyicilerin herhangi birine bir eylem yöntemi eklemektir.

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

Olarak html erişin http: // yoursite / denetleyici / MyHtml . Bu eylem yöntemini, html dosya adını method / querystrign parametresi olarak kabul edecek ve dosyayı çalışma zamanında oluşturacak şekilde genişletebilirsiniz, örneğin bunun gibi bir şey.

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

0

İç görünüm klasörünü kullanmayı planlıyorsanız, yukarıdaki yanıtlar en iyisi olmalıdır, ancak bu yanıt, asp.net mvc çekirdeğine geçiş yapan kullanıcılar için yararlı olabilir. Dosyaları görünümler klasörü yerine wwwroot'a yerleştirmek, html sayfalarınızın localhost / myfile.html olarak kolayca erişmesini sağlamalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.