2013-07-30 28 views
72

Tôi muốn có thể yêu cầu các tệp tĩnh .html nằm trong thư mục ~/Views. Theo tài liệu, hệ thống định tuyến sẽ kiểm tra xem URL có khớp với một tệp đĩa trước khi đánh giá các tuyến của ứng dụng hay không.Làm thế nào để bạn yêu cầu tệp .html tĩnh trong thư mục ~/Views trong ASP.NET MVC?

Nhưng khi tôi yêu cầu tệp xảy ra lỗi 404.

Tệp của tôi nằm trong thư mục ~/Views. URL là: http://[localhost]/Views/HtmlPage1.html

Tôi đã bỏ lỡ điều gì?

Trả lời

85

Tôi muốn có thể yêu cầu tệp .html tĩnh nằm trong thư mục '~/Views'.

Bạn không thể. Có tệp web.config trong thư mục này cấm truy cập bất kỳ tệp nào từ thư mục đó một cách rõ ràng. Nếu bạn muốn có thể truy cập các tập tin từ máy khách, các tập tin đó sẽ không được đặt trong thư mục Views có một ý nghĩa đặc biệt trong ASP.NET MVC.

Bạn có thể có thư mục ~/Static nơi bạn có thể đặt các tệp HTML của mình. Và sau đó truy cập vào nó như thế:

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

Hoặc, thay vì đặt tên thư mục 'tĩnh', bạn có thể bắt chước cấu trúc tên bộ điều khiển được tìm thấy bên trong thư mục Views .. để URL có cùng 'hình thức'. Ví dụ. vì bạn không thể đặt plainjane của bạn * Edit.html * trong Views/Order/Edit.html - bạn đặt nó trong ~/Order/Edit.html – bkwdesign

+2

Điều này bây giờ đã thay đổi với ASP.NET mới nhất (vNext), nơi bạn có thể đăng ký nhà cung cấp tĩnh cho các tệp html nhưng cũng vẫn định tuyến theo cách MVC bình thường. Chỉ có một vở kịch nhanh với nó nhưng đó là những gì tôi đã làm với một dự án thử nghiệm. Chạy qua kestrel trên Linux .. nhưng IIS nên giống như tôi giả sử. – ppumkin

+1

@bkwdesign Tôi chắc chắn cấu hình của nó được kiểm soát bằng cách bắt chước cấu trúc thư mục đã làm rối loạn trình xử lý mặc định của trình điều khiển của tôi và làm cho nó không thể truy cập được. Vì vậy, hãy kiểm tra tình huống này. –

29

Tôi muốn để có thể yêu cầu các file .html tĩnh mà được đặt tại thư mục ~/Lần đọc.

Bạn có thể. Câu trả lời được đánh dấu không hoàn toàn chính xác, mặc dù nó đưa ra một giải pháp.

Lý do trong câu trả lời được đánh dấu là chính xác, đó là web.config (cài đặt BlockViewHandler là cụ thể) trong thư mục Chế độ xem để ngăn các tệp được truy cập trực tiếp. Nó là có cho việc đảm bảo các quan điểm trong Asp.Net MVC. Nhưng nếu bạn hỏi một câu hỏi về việc cung cấp các tệp này trực tiếp thì bạn có thể có lý do hợp lệ để làm như vậy, như sử dụng các khung nhìn một phần AngularJS (như trong trường hợp của chúng ta).

Vì vậy, đây là một tinh chỉnh rất đơn giản mà bạn có thể thực hiện trong tệp web.config được tìm thấy trong thư mục Views, mà không ảnh hưởng đến tính bảo mật của chế độ xem asp.net asp.net của bạn. Điều này sẽ đảm bảo các tập tin .cshtml như bình thường nhưng lại file .html của bạn alone.A

Thay đổi này

<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

Điều này vẫn có thể nguy hiểm với các tệp khác như tệp .aspx hoặc .ascx hoặc các tệp từ công cụ xem của bên thứ ba. Tốt hơn nhiều cho danh sách trắng theo câu trả lời của cs3x. – pwdst

+1

@pwdst: Nếu bạn đang sử dụng hỗn hợp các chế độ xem phía máy chủ thì có thể có các loại cá nhân được liệt kê trong danh sách trắng tốt hơn. Chúng tôi chỉ muốn bảo vệ các tệp .cshtml vì vậy chúng tôi đã sử dụng tệp này vì nó ít tốn kém hơn một chút. – Vikas

59

Để cho phép các tập tin như js và html trong thư mục Chế độ xem chỉnh sửa web.config trong chế độ xem-Thư mục:

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

+7

+ điểm brownie cho Kermit –

+0

Tôi phải xóa dòng "routes.RouteExistingFiles = true;" trong RouteConfig.RegisterRoutes để làm việc này –

+0

Trong khi câu trả lời được đánh dấu chứa thông tin hữu ích, đây là câu trả lời tốt hơn. Thử nghiệm và làm việc trong dự án hiện tại của tôi. –

9

Một tùy chọn khác thay thế là để chèn một phương pháp hành động trong bất kỳ bộ điều khiển mong muốn để phục vụ các tập tin html

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

Truy cập html như http://yoursite/controller/MyHtml.Bạn có thể mở rộng phương thức hành động này để chấp nhận tên tệp html dưới dạng tham số method/querystrign và hiển thị tệp lúc chạy, ví dụ như thế này.

public ActionResult MyHtml(string htmlPageName) 
{ 
     var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html"); 
     return result; 
} 
Các vấn đề liên quan