2013-08-21 4 views
5

Ich habe an einer MVC-Webanwendung gearbeitet, die den von Cloud9 bereitgestellten Browser-Code-Editor Ace verwendet. Das Skript ace.js und ein Skript, das den Editor von ace zusammenstellt, befinden sich beide in einem ScriptBundle zusammen auf meiner BundleConfig. Das Bündel wird perfekt geladen. Auf meinem lokalen Server, mit debug in der web.config auf true gesetzt, funktionierte das Skript einwandfrei. Nach dem Start auf einem Live-Server mit debug auf false in der Datei web.config erschienen mehrere Fehler.Wie behalte Ace die Suche nach Designs und Modi im aktuellen Verzeichnis?

Nach der Behebung einiger kleinerer Fehler bleiben zwei Fehler, von denen ich die Ursache nicht verstehen kann. Diese beiden Fehler scheinen sehr ähnlich zu sein, da es sich bei beiden um Fehler 404 handelt, die für Ace's Chrome-Theme und Ace's HTML-Modus-Scripte nicht gefunden wurden. Im Skript, das den Editor einrichtet, werden sie wie folgt aufgerufen:

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

Auf meinem lokalen Computer mit Debugging auf true gesetzt, das Thema und die Art sind völlig in Ordnung gesetzt, und alles funktioniert wie geplant. Wie ich bereits sagte, auf einem Live-Server, bei dem das Debugging auf "false" gesetzt ist und daher alle Skripte in meinen ScriptBundles minimiert werden, erhalte ich sowohl für das Thema als auch für den Modus einen 404-Fehler.

Wenn ich die JavaScript-Konsole in Google Chrome hochfahre, werden mir die beiden 404-Fehler mitgeteilt. Das Lustige an den 404-Fehlern ist, dass sie mit dem aktuellen Verzeichnis der angezeigten Seite verlinken, gefolgt von "theme-chrome.js" bzw. "mode-html.js". Sie waren nie in diesem Verzeichnis und sind es immer noch nicht.

Also meine Frage ist, warum beginnen die Skripte in das aktuelle Verzeichnis für ihre Dateien nach der Minimierung suchen? Was kann ich tun, um dieses Problem zu beheben, damit ich sie in Bündeln minimieren kann und sie funktionieren lassen? Oder gibt es einen Weg?

Vielen Dank für Ihre Hilfe im Voraus der Zeit.

Antwort

12

Ich finde mit Ace und MVC Bundling und Minification, ich muss den BasePath in der ACE-Konfiguration mit einer absoluten Referenz setzen.

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

Es ist wahrscheinlich nicht die beste Lösung, aber es sollte Sie auf Ihrem Weg bekommen.

+0

Perfect! Es hat wie ein Zauber funktioniert. Das zu wissen hätte viel Zeit gespart. – NoahWillCrow

+1

@Paul, das ist die beste Lösung. –

3

Der Grund, warum Ace den Basispfad beim Minimieren nicht auflöst, liegt darin, dass die verkleinerte Version ein neuer eindeutiger Name ist, der nicht mit diesem Muster übereinstimmt: ^(.*)\/ace(\-\w+)?\.js(\?|$)/. Ace verwendet dieses Muster, um das Skriptelement zu finden, das es erstellt hat, und verwendet das Attribut src, um den Pfad zu bestimmen.

@ Paul Antwort ist die beste, aber wenn aus irgendeinem Grunde können Sie es auf diese Weise nicht, Ace überprüft auch für Optionen in Attributen, die mit data-ace- beginnen, dass ein Teil von jedem Script-Tag.

In System.Web.Optimization v 1.10 Sie Scripts.RenderFormat(format, script) verwenden können, um den Skript-Tag zu machen, den Basispfad zu spezifizieren.

HINWEIS: In anderen Antworten Stack-Überlauf sagen sie Microsoft.AspNet.Web.Optimization zu verwenden, aber das ist nicht mehr der Fall. Möglicherweise müssen Sie nuget verwenden, um Ihre Version zu aktualisieren.

MVC Version

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

Web Forms Version

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