คุณขอไฟล์. html แบบคงที่ภายใต้โฟลเดอร์ ~ / Views ใน ASP.NET MVC ได้อย่างไร?


92

ฉันต้องการขอ.htmlไฟล์แบบคงที่ซึ่งอยู่ใน~/Viewsโฟลเดอร์นี้ ตามเอกสารประกอบระบบเส้นทางจะตรวจสอบว่า URL ตรงกับไฟล์ดิสก์หรือไม่ก่อนที่จะประเมินเส้นทางของแอปพลิเคชัน

แต่เมื่อฉันขอไฟล์404เกิดข้อผิดพลาด

ไฟล์ของฉันอยู่ในโฟลเดอร์ ~ / Views URL คือ:http://[localhost]/Views/HtmlPage1.html

ฉันพลาดอะไรไป?

คำตอบ:


111

ฉันต้องการขอไฟล์. html แบบคงที่ซึ่งอยู่ในโฟลเดอร์ '~ / Views'

คุณทำไม่ได้ มีไฟล์ web.config ในโฟลเดอร์นี้ซึ่งห้ามไม่ให้เข้าถึงไฟล์ใด ๆ จากมันอย่างชัดเจน หากคุณต้องการเข้าถึงไฟล์จากไคลเอนต์ไฟล์เหล่านั้นไม่ควรวางไว้ในViewsโฟลเดอร์ที่มีความหมายพิเศษใน ASP.NET MVC

คุณสามารถมี~/Staticโฟลเดอร์ที่คุณสามารถวางไฟล์ HTML ได้ จากนั้นเข้าถึงได้ดังนี้:

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

4
หรือแทนที่จะตั้งชื่อโฟลเดอร์ของคุณเป็น "แบบคงที่" คุณสามารถเลียนแบบโครงสร้างชื่อคอนโทรลเลอร์ที่พบในโฟลเดอร์ Views ได้ดังนั้น URL จึงมี "ลักษณะที่ปรากฏ" เหมือนกัน เช่นเนื่องจากคุณไม่สามารถใส่ plainjane Edit.htmlใน Views / Order / Edit.html - คุณใส่ไว้ใน ~ / Order / Edit.html
bkwdesign

2
ตอนนี้เปลี่ยนไปแล้วด้วย ASP.NET ล่าสุด (vNext) ที่คุณสามารถลงทะเบียนผู้ให้บริการแบบคงที่สำหรับไฟล์ html แต่ยังกำหนดเส้นทาง MVC ตามปกติ มีเพียงการเล่นอย่างรวดเร็ว แต่นั่นคือสิ่งที่ฉันทำกับโครงการทดสอบ ทำงานผ่าน kestrel บน Linux .. แต่ IIS ก็น่าจะเหมือนกัน
Piotr Kula

1
@bkwdesign ฉันแน่ใจว่าการกำหนดค่าควบคุมโดยการเลียนแบบโครงสร้างโฟลเดอร์ทำให้ตัวจัดการเริ่มต้นของคอนโทรลเลอร์ของฉันยุ่งและทำให้ไม่สามารถเข้าถึงได้ ดังนั้นทดสอบสถานการณ์นี้
Hunter-Orionnoir

78

ในการอนุญาตไฟล์เช่น js และ html ในโฟลเดอร์ Views ให้แก้ไข web.config ใน 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>


1
ฉันต้องลบบรรทัด "route.RouteExistingFiles = true;" ใน RouteConfig.RegisterRoutes เพื่อให้ใช้งานได้
Sam Sippe

แม้ว่าคำตอบที่ทำเครื่องหมายไว้จะมีข้อมูลที่เป็นประโยชน์ แต่นี่เป็นคำตอบที่ดีกว่า ผ่านการทดสอบและทำงานในโครงการปัจจุบันของฉัน
อ. เมอร์เรย์

1
ไฟล์ css ล่ะ
Leandro

คำตอบของ @Darin Dimitrov ให้วิธีแก้ปัญหา แต่ควรทำเครื่องหมายว่าเป็นคำตอบ
Kunal

31

ฉันต้องการขอไฟล์. html แบบคงที่ซึ่งอยู่ในโฟลเดอร์ ~ / Views

คุณทำได้ คำตอบที่ทำเครื่องหมายไว้ไม่ถูกต้องทั้งหมดแม้ว่าจะให้คำตอบก็ตาม

การให้เหตุผลในคำตอบที่ทำเครื่องหมายนั้นถูกต้องคือ web.config (การตั้งค่า BlockViewHandler เฉพาะ) ในโฟลเดอร์ Views ที่ป้องกันไม่ให้เข้าถึงไฟล์โดยตรง มีไว้สำหรับการรักษาความปลอดภัยมุมมองใน Asp.Net MVC แต่ถ้าคุณถามคำถามเกี่ยวกับการให้บริการไฟล์เหล่านี้โดยตรงคุณอาจมีเหตุผลที่ถูกต้องในการทำเช่นนั้นเช่นการใช้มุมมองบางส่วนของ AngularJS (เช่นในกรณีของเรา) ซึ่งเราไม่ต้องการทำซ้ำโฟลเดอร์มุมมองที่มีชื่อแปลก ๆ

ดังนั้นนี่คือการปรับแต่งที่ง่ายมากที่คุณสามารถทำได้ในไฟล์ web.config ที่พบในโฟลเดอร์ Views โดยไม่สูญเสียความปลอดภัยของมุมมอง mvc ของ asp.net ของคุณ สิ่งนี้จะรักษาความปลอดภัยไฟล์. cshtml ตามปกติ แต่ปล่อยให้ไฟล์. html ของคุณอยู่คนเดียว

เปลี่ยนสิ่งนี้

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

--ถึง--

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

3
การดำเนินการนี้ยังอาจเป็นอันตรายกับไฟล์อื่น ๆ เช่นไฟล์. aspx หรือ. ascx หรือไฟล์จากเอนจินมุมมองของบุคคลที่สาม ดีกว่ามากในการอนุญาตพิเศษตามคำตอบของ cs3x
pwdst

1
@pwdst: หากคุณใช้การผสมผสานระหว่างมุมมองฝั่งเซิร์ฟเวอร์ใช่การอนุญาตพิเศษแต่ละประเภทอาจดีกว่า เราแค่ต้องการป้องกันไฟล์. cshtml ดังนั้นเราจึงใช้สิ่งนี้เนื่องจากมีรายละเอียดน้อยกว่าเล็กน้อย
Vikas

14

อีกทางเลือกหนึ่งคือการแทรกวิธีการดำเนินการในคอนโทรลเลอร์ที่ต้องการเพื่อให้บริการไฟล์ html

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

เข้า html ที่เป็นhttp: // yoursite / ควบคุม / MyHtml คุณสามารถขยายวิธีการดำเนินการนี้เพื่อยอมรับชื่อไฟล์ html เป็นพารามิเตอร์ method / querystrign และแสดงไฟล์ในขณะรันไทม์เช่นอะไรทำนองนี้

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

0

หากคุณกำลังวางแผนที่จะใช้โฟลเดอร์มุมมองภายในคำตอบข้างต้นน่าจะดีที่สุด แต่คำตอบนี้อาจเป็นประโยชน์สำหรับผู้ใช้ที่กำลังย้ายไปยังแกน mvc ของ asp.net การวางไฟล์ใน wwwroot แทนที่จะเป็นโฟลเดอร์ views ควรทำให้หน้า html ของคุณเข้าถึงได้ง่ายเหมือน localhost / myfile.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.