Làm cách nào để bạn yêu cầu tệp .html tĩnh trong thư mục ~ / Views trong ASP.NET MVC?


92

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

Nhưng khi tôi yêu cầu tệp, một 404lỗi phát sinh.

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

Câu trả lời:


111

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

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

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

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

4
Hoặc, thay vì đặt tên thư mục của bạn là '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 Chế độ xem .. để URL có cùng 'diện mạo'. Ví dụ như kể từ khi bạn không thể đặt plainjane bạn Edit.html trong Views / Order / Edit.html - bạn đặt nó trong ~ / Order / Edit.html
bkwdesign

2
Điều này hiện đã thay đổi với ASP.NET (vNext) mới nhất, nơi bạn có thể đăng ký nhà cung cấp tĩnh cho các tệp html nhưng vẫn định tuyến theo cách MVC bình thường. Chỉ có một lần chơi 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 tôi cho là IIS phải giống nhau.
Piotr Kula

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

78

Để cho phép các tệp như js và html trong thư mục Views, hãy chỉnh sửa web.config trong 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
Tôi đã phải xóa dòng "route.RouteExistingFiles = true;" trong RouteConfig.RegisterRoutes cho điều này để làm việc
Sam Sippe

Mặc dù câu trả lời được đánh dấu chứa thông tin hữu ích, nhưng đâ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.
A. Murray

1
Còn các tệp css?
Leandro

Câu trả lời @Darin Dimitrov của đưa ra một cách giải quyết, nhưng điều này nên được đánh dấu là câu trả lời
Kunal

31

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

Bạn có thể. Câu trả lời được đánh dấu không hoàn toàn đúng, 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à đúng, đó là web.config (cụ thể là cài đặt BlockViewHandler) trong thư mục Views ngăn không cho các tệp được truy cập trực tiếp. Nó ở đó để đảm bảo các lượt xem trong Asp.Net MVC. Nhưng nếu bạn đặ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, chẳng hạn như sử dụng chế độ xem từng phần AngularJS (như trong trường hợp của chúng tôi) nơi chúng tôi không muốn sao chép thư mục chế độ xem với những cái tên kỳ lạ.

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 Chế độ xem mà không ảnh hưởng đến bảo mật của các chế độ xem mvc trong asp.net của bạn. Điều này sẽ bảo mật các tệp .cshtml như bình thường nhưng để các tệp .html của bạn yên.

Thay đổi điều này

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

--đến--

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

3
Đ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 nên đưa vào 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ể liệt kê các loại riêng lẻ vào danh sách trắng có thể 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 điều này vì nó ít dài dòng hơn một chút.
Vikas

14

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

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

Truy cập html dưới dạng http: // yourite / 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 làm tham số method / querystrign và hiển thị tệp tại thời điểm chạy, ví dụ như một cái gì đó như thế này.

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

0

Nếu bạn đang có kế hoạch sử dụng thư mục bên trong chế độ xem, câu trả lời ở trên là tốt nhất nhưng câu trả lời này có thể hữu ích cho người dùng đang di chuyển sang asp.net mvc core. Đặt các tệp trong wwwroot thay vì thư mục views sẽ giúp các trang html của bạn truy cập dễ dàng dưới dạng localhost / myfile.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.