2013-07-30 9 views
72

~/Views klasöründe bulunan statik .html dosyalarını istemek istiyorum. 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.ASP.NET MVC'de ~/Views klasörünün altında statik .html dosyalarını nasıl talep edersiniz?

Ama 404 hata ortaya çıkar dosyayı istediğinde.

Dosyam ~/Görünümler klasöründe bulunur. URL şudur: http://[localhost]/Views/HtmlPage1.html

Neyi özledim?

cevap

85

'~/Görünümler' klasöründe bulunan statik .html dosyaları için istekte bulunmak istiyorum.

Yapamazsın. Bu klasördeki herhangi bir dosyaya erişmeyi açıkça yasaklayan bir web.config dosyası var. İstemciden dosyalara erişmek istiyorsanız, bu dosyalar ASP.NET MVC'de özel bir anlamı olan Views klasörüne yerleştirilmemelidir.

Size HTML dosyaları yerleştirmek olabilecek bir ~/Static klasör olabilir. Ve sonra böyle erişmek:

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

Veya, klasörünüzün adını "statik" olarak adlandırmak yerine, Görünümler klasörünün içinde bulunan denetleyici adı yapısını taklit edebilirsiniz. Böylece URL 'görünüm' ile aynıdır. Örneğin. Görünüm/Sipariş/Edit.html içinde plainjane * Edit.html * koyamazsınız çünkü ~/Order/Edit.html koyduysanız – bkwdesign

+2

Bu şimdi en son ASP.NET (vNext) ile değişti nerede html dosyaları için statik sağlayıcı kayıt ama aynı zamanda hala normal MVC yolunu yönlendirin. Sadece onunla hızlı bir şekilde oynadım, ancak bir test projesiyle yaptığım şey buydu. Linux'ta kestrel ile koşuyoruz ... ama IIS'in de aynı olması gerektiğini düşünüyorum. – ppumkin

+1

@bkwdesign Yapılandırıcımın varsayılan işleyicimi dağıttığı klasör yapısını taklit ederek yapılandırmasını denetlediğinden ve erişilemediğinden eminim. Bu durumu test et. –

29

Ben ~/Görüntüleme klasöründe bulunan statik html dosyaları talep etmek isterler.

Eh yapabilirsiniz. Bir çözüm vermesine rağmen, işaretli cevap tamamen doğru değildir. İşaretli cevap

muhakeme doğru olduğunu, doğrudan erişilebilir dosyaları engeller Görüntüleme klasöründe web.config (spesifik olacak şekilde ayarlamaktır BlockViewHandler) 'dir. Asp.Net MVC'de görüntülerin güvenliğini sağlamak için var. Ancak, bu dosyaları doğrudan sunma ile ilgili bir soru sorduysanız, AngularJS kısmi görünümlerini (bizim durumumuzda olduğu gibi) kullanarak garip adlar içeren görünümler klasörünü çoğaltmak istemediğimiz gibi geçerli bir nedeniniz olabilir.

Yani burada asp.net mvc görünümleri güvenliğini tehlikeye atmadan, Görünümler klasöründe bulunan web.config dosyasında yapabileceği çok basit bir çimdik olduğunu. Bu, bu

<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

Bu, .aspx veya .ascx dosyaları veya üçüncü taraf görünüm motorlarından olanlar gibi diğer dosyalarla de tehlikeli olabilir. Cs3x'in cevabı uyarınca çok daha iyi beyaz liste. – pwdst

+1

@pwdst: Sunucu tarafı görünümlerinin bir karışımını kullanıyorsanız, evet, bağımsız türlerin beyaz listeye eklenmesi daha iyi olabilir. Biz sadece .cshtml dosyalarını korumak istiyoruz, bu yüzden bunu biraz daha az ayrıntılı olarak kullandık. Kermit – Vikas

59

js ve html gibi dosyaları izin vermek için her zamanki gibi .cshtml dosyaları güvenli ama

Değişim alone.A sizin .html dosyaları bırakacaktır

<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> 

: Görüntüleme klasöründeki görünümleri-klasörde web.config düzenlemek
+7

+ brownie puanları "route.RouteExistingFiles = true;" satırını kaldırmak zorunda kaldım Bunun için RouteConfig.RegisterRoutes içinde –

+0

için –

+0

işaretli cevap yararlı bilgiler içeriyor olsa da, bu daha iyi bir cevaptır. Mevcut projemde test edildi ve çalışıyor. –

9

Diğer bir alternatif bir seçenek, HTML dosyası

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

Erişim http://yoursite/controller/MyHtml olarak HTML hizmet için istenen kumandanın herhangi bir eylem yöntemi sokmaktır.Bu eylem yöntemini, html dosya ismini method/querystrign parametresi olarak kabul etmek ve dosyayı çalışma zamanında, ör.

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