2012-07-03 22 views
5

Tôi cần thêm một số cuộc sống mới vào ứng dụng cũ :)Gọi trình điều khiển ASP.NET MVC Khi yêu cầu tệp .html

Tôi muốn gọi bộ điều khiển MVC khi trang HTML "tĩnh" được yêu cầu để thêm một số đánh dấu vào trang trước khi trả lại cho khách hàng.

Tôi cố gắng để làm theo các cách tiếp cận tìm thấy trong luồng này: How to read web.config settings in .html page?

... nhưng mặc dù tôi có tuyến đường này định nghĩa:

routes.MapRoute(
    name: "Topic", 
    url: "html/{fileName}.html", 
    defaults: new { controller = "Topic", action = "Index" }); 

bộ điều khiển không được gọi. Tôi có web.config của tôi được xác định với:

<remove name="WebServiceHandlerFactory-Integrated" /> 
<add name="HTML" path="*.html" verb="*" 
    type="System.Web.UI.PageHandlerFactory" 
    resourceType="File" preCondition="integratedMode" /> 

Tôi nghi ngờ rằng tôi cần phải gọi một thứ khác ngoài PageHandlerFactory hoặc có lẽ vấn đề là một điều hoàn toàn khác.

CẬP NHẬT: Môi trường dev của tôi đang làm việc với chế độ đường ống tích hợp, nhưng tôi cần kiểm tra xem môi trường sản xuất của tôi có hỗ trợ không.

+3

Bạn có đang chạy trong chế độ đường ống tích hợp IIS7 + không? –

Trả lời

6

Nếu bạn làm điều này:

routes.RouteExistingFiles = true; 

Bạn nên tìm công trình này - thậm chí không có sự bổ sung xử lý. Trong bộ điều khiển, bạn có thể tải HTML trực tiếp bằng cách sử dụng phương thức GetFile của HostingEnvironment.VirtualPathProvider và làm điều gì đó với nó - hoặc tốt hơn vẫn chỉ sử dụng chế độ xem MVC bình thường để hiển thị cùng nội dung với tệp tĩnh, chỉ với các bổ sung của bạn.

Mặc dù lưu ý rằng điều này có nghĩa là bất kỳ tệp nào có khả năng bị phát hiện bởi bất kỳ tuyến đường nào cũng sẽ được đưa vào đường ống MVC. Tuy nhiên, đây không phải là một mối quan tâm, nếu việc tách các tuyến đường và đường dẫn vật lý được sử dụng.

+0

Câu trả lời thực sự cho câu hỏi là làm cả những gì Andras và Scott đề xuất. Tôi đã thử nghiệm cả có và không có bản cập nhật cho các tuyến (mỗi Andras) và có và không có cài đặt web.config (trên mỗi Scott) và cả hai đều được yêu cầu để làm cho nó hoạt động cho những gì tôi đang cố gắng làm. Cảm ơn các bạn! –

+0

Tôi đã thêm một số quy tắc IgnoreRoutes để mở ứng dụng đến nội dung tĩnh khác không yêu cầu máy chủ xử lý. –

+0

Vâng, đó là một ý tưởng hay :) –

3

Tôi thiết lập tình huống tương tự như bạn và nó hoạt động tốt cho tôi, vì vậy bạn có các thành phần chính tại chỗ. Một số điều cần ghi nhớ đối với việc thử nghiệm và xử lý sự cố:

web.config của bạn không cần các nhà cung cấp xây dựng cho phần mở rộng html:

<system.web> 
    <compilation> 
     <buildProviders> 
     <add extension=".html" 
      type="System.Web.Compilation.PageBuildProvider" /> 
     </buildProviders> 
    </compilation> 
</system.web> 

Một sao chép và dán các bộ xử lý của bạn làm việc cho tôi, vì vậy mà có vẻ tốt.

Và một bản sao và dán của MapRoute của bạn hoạt động cho tôi quá, mặc dù tôi đã sử dụng bộ điều khiển Trang chủ mặc định trong một dự án sạch. Vì vậy, như một kiểm tra đôi chỉ cần xác nhận rằng bạn có một bộ điều khiển được gọi là Chủ đề với một phương pháp ActionResult gọi là Index().

Và đảm bảo rằng url của bạn là localhost.com:{port}/html/test.html với/html/trong đường dẫn vì quy tắc của bạn yêu cầu điều đó.

Một thử nghiệm tốt khác là thay đổi MapRoute của bạn để sử dụng aspx thay vào đó và kiểm tra trang aspx và xem nó có hoạt động hay không. Điều đó sẽ xác nhận có hay không đó là ánh xạ IIS hoặc nếu đó là các quy tắc MVC. Nếu nó hoạt động với aspx thì vấn đề có liên quan đến trình xử lý, nhưng nếu nó không thành công với aspx thì đó là một cái gì đó với MVC.

Đồng thời xác nhận rằng bạn đang sử dụng IIS Express chứ không phải Cassini. Cassini sẽ không xử lý chính xác, nhưng IIS Express sẽ. Bạn có thể xác nhận bằng cách nhấp chuột phải vào dự án của bạn và bạn sẽ thấy một tùy chọn trình đơn được gọi là "Sử dụng Visual Studio Development Studio ...". Điều đó sẽ chỉ tồn tại nếu bạn hiện đang sử dụng IIS Express.

+0

Tôi không nghĩ rằng điều này sẽ giúp nếu bạn muốn yêu cầu nhấn một bộ điều khiển MVC - trang sẽ không được thực hiện trực tiếp, vì nó được dự định là khi PageBuildProvider được sử dụng, nhưng thay vào đó yêu cầu sẽ được chuyển đến một MVC bộ điều khiển, sau đó sẽ kết thúc hiển thị một chế độ xem (có thể là ASPX, có thể là Dao cạo hoặc bất kỳ thứ gì) trên * thay mặt * của URL có phần mở rộng '.html' –

+0

@Andras Zoltan, bạn nói đúng, hãy tính toán tệp hiện có bạn cần phải thêm các routes.RouteExistingFiles = true từ câu trả lời của bạn. –

+0

Như tôi đã nói ở trên, khắc phục sự cố cho tôi là tích hợp phản hồi từ cả Scott và Andras. Tôi phải chọn một cái để tôi đánh dấu Andras là câu trả lời vì anh ấy đã thêm con trỏ vào cấu hình tuyến đường không được đề cập đến trong câu hỏi này hoặc câu hỏi mà tôi đã liên kết ban đầu. –

Các vấn đề liên quan