2013-08-21 27 views
5

Tôi đã làm việc trên một ứng dụng web MVC sử dụng trình soạn thảo mã Ace trong trình duyệt do Cloud9 cung cấp. Tập lệnh ace.js và một kịch bản thiết lập trình soạn thảo của ace đều nằm trong một ScriptBundle cùng nhau trên BundleConfig của tôi. Gói đang được tải hoàn toàn tốt. Trên máy chủ cục bộ của tôi, với gỡ lỗi được đặt thành true trong web.config, tập lệnh hoạt động hoàn toàn tốt. Tuy nhiên, sau khi khởi chạy đến một máy chủ trực tiếp có gỡ lỗi được đặt thành false trong web.config, một số lỗi xuất hiện.Làm thế nào để giữ Ace khỏi tìm kiếm chủ đề và chế độ trong thư mục hiện tại?

Sau khi khắc phục một số lỗi nhỏ, có hai lỗi mà tôi không thể hiểu được nguyên nhân của. Hai lỗi này có vẻ rất giống nhau, vì chúng đều là lỗi 404 không tìm thấy đối với chủ đề chrome của Ace và tập lệnh chế độ HTML của Ace. Trong kịch bản đó thiết lập các biên tập viên, chúng được gọi như sau:

editor.setTheme("ace/theme/chrome"); 
editor.getSession().setMode("ace/mode/html"); 

Trên máy tính địa phương của tôi, với lỗi thiết lập là true, chủ đề và các chế độ được thiết lập hoàn toàn tốt đẹp, và mọi thứ hoạt động theo kế hoạch. Tuy nhiên, như tôi đã nói, trên một máy chủ trực tiếp có gỡ lỗi được đặt thành false, do đó giảm thiểu tất cả các tập lệnh trong ScriptBundles của tôi, tôi nhận được lỗi 404 cho cả chủ đề và chế độ.

Khi tôi kéo Bảng điều khiển JavaScript trong Google Chrome, tôi được thông báo về hai lỗi 404. Điều buồn cười về lỗi 404, là chúng đang liên kết đến thư mục hiện tại của trang tôi đang xem, sau đó theo sau là "theme-chrome.js" và "mode-html.js" tương ứng. Họ đã không bao giờ trong thư mục đó, và vẫn không.

Vì vậy, câu hỏi của tôi là tại sao các tập lệnh bắt đầu tìm trong thư mục hiện tại cho tệp của chúng sau khi được rút gọn? Tôi có thể làm gì để khắc phục sự cố này để tôi có thể giữ chúng được rút gọn, theo nhóm và khiến chúng hoạt động? Hay là có cách nào?

Cảm ơn sự giúp đỡ của bạn trước thời hạn.

Trả lời

12

Tôi tìm thấy với Ace và MVC Bundling and Minification, tôi cần đặt basePath trong cấu hình ace bằng cách sử dụng tham chiếu tuyệt đối.

ace.config.set("basePath", "/Scripts/FullPathToMy/AceEditorDirectory"); 

Đây có thể không phải là giải pháp tốt nhất, nhưng nó sẽ giúp bạn trên con đường của bạn.

+0

Perfect! Nó làm việc như một say mê. Biết điều này sẽ tiết kiệm rất nhiều thời gian. – NoahWillCrow

+1

@Paul, đây là giải pháp tốt nhất. –

3

Lý do tại sao Ace không giải quyết đường dẫn cơ sở khi bạn rút gọn là vì phiên bản được rút gọn là tên duy nhất mới không khớp với mẫu này: ^(.*)\/ace(\-\w+)?\.js(\?|$)/. Ace sử dụng mẫu đó để tìm phần tử kịch bản đã tạo ra nó và sử dụng thuộc tính src để xác định đường dẫn.

@ câu trả lời của Paul là tốt nhất, nhưng nếu vì một lý do bạn không thể làm điều đó theo cách đó, Ace cũng kiểm tra các tùy chọn trong thuộc tính bắt đầu với data-ace- rằng một phần của thẻ bất kỳ kịch bản.

Trong System.Web.Optimization v 1.10 bạn có thể sử dụng Scripts.RenderFormat(format, script) để render các thẻ script để chỉ định đường dẫn cơ sở.

LƯU Ý: Trong câu trả lời Stack Overflow khác họ nói để sử dụng Microsoft.AspNet.Web.Optimization, nhưng điều này không còn là trường hợp. Bạn có thể phải sử dụng nuget để cập nhật phiên bản của mình.

phiên bản MVC

@Scripts.RenderFormat(@"<script src=""{0}"" data-ace-base=""/Scripts/ace/""></script>", "~/bundlepath") 

Web Forms phiên bản

<%: Scripts.RenderFormat(@"<script src=""{0}"" data-ace-base=""/Scripts/ace/""></script>", "~/bundlepath") %> 
Các vấn đề liên quan