2009-08-11 6 views
4

Ich weiß, dass es eine einfache Antwort darauf gibt, aber das kommt in Form von 2 Problemen.Wie man Variablen in eine JS-Datei übergibt

Problem 1:

In einer asp.net Seite gibt es ein Javascript-Block wie folgt aus:

<script type="text/javascript"> 
    function doSomethingRandom() { 
     var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
    } 
</script> 

Ok, also ist es eine vereinfachte Version des Problems, aber es sollte klar sein, . Ich möchte jetzt diese Funktion in eine JS-Datei verschieben ... aber ich kann nicht die Asp: Literal in die JS.

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
<script src="myJSFile.js" /> 

... macht mich ein wenig krank, gibt es einen besseren Weg?

Problem 2:

ähnliches Problem, aber dieses Mal die zweite Version sieht wie folgt aus:

<asp:ScriptManagerProxy runat="server"> 
    <Scripts> 
     <asp:ScriptReference Path="~/tree/AttributeTree.js" /> 
    </Scripts> 
</asp:ScriptManagerProxy> 

Aber diesmal kann ich nicht realistisch setzen die

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 

darüber hinaus, weil es mit dem ScriptManagerProxy keine wirkliche Möglichkeit gibt, genau zu wissen, wo die Skriptdatei erscheinen wird.

Also, sie sind die Probleme! Vielen Dank.

Antwort

3

Wir verwenden die Methode PageRegisterStartupScript, um Initialisierungsfunktionen mit dem ClientScriptManager zu registrieren. Unsere Javascript-Dateien enthalten nur Funktionen und werden über ScriptManager geladen (wie in Ihrem Snippet). Wir schrieben eine Erweiterungsmethode für die Seite (genannt JSStartupScript), die mit der Registrierung der Startskripts und am Ende des Tages unseres Code wie folgt aussieht hilft:

<% 
    Page.JSStartupScript(string.Format("initFeatureX({0}, {1}, {2});", 
     AntiXss.JavaScriptEncode(ViewData.Property1), 
     AntiXss.JavaScriptEncode(ViewData.Property2), 
     AntiXss.JavaScriptEncode(ViewData.Property3))); 
%> 

Dies funktioniert auch groß in Kombination mit dem ScriptManager s CompositeScript Sammlung und LoadScriptsBeforeUI = false Einstellung.

+0

+1, genau das, was ich in einem aktuellen Projekt getan habe –

1

Grundsätzlich: Sie können das nicht tun.

Was Sie tun können, ist den Wert auf der Website, die von ASP generiert wird (wie Sie jetzt haben), und beziehen Sie sich auf diese Variable aus externen js-Skripten, aber das ist hässlich.

Die andere Lösung ist, dass Sie diese Variable in einem Cookie speichern können (der von ASP gesetzt wird) und dann diesen Cookie in externen JS lesen. Sie können diesen Wert auch an eine URL einer angezeigten Site übergeben und die URL in JS parsen, um den Wert zu erhalten, aber ich denke, dass Cookies dafür besser sind, da Sie immer noch eine saubere URL haben und das Lesen von Cookies leichter ist params.

+0

+1 für Cookies. Gute Idee. –

0

Sie können eine aspx-Datei als js-Datei verwenden.

\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>

Das können Sie tun, was Sie in der aspx wollen.

+0

(Entfernen Sie den Schrägstrich - stackoverflow wollte sonst das Skript-Tag entfernen) –

+1

Sie werden Caching-Probleme mit dieser Lösung haben, fürchte ich. Wenn Sie keinen dynamischen Parameter in der Verknüpfung hinterlassen, wird Ihr Browser ihn wahrscheinlich zwischenspeichern und keine aktualisierte Version herunterladen, die sich möglicherweise geändert hat, weil sich die ID geändert hat. Und wenn Sie dynamische Parameter hinzufügen, lädt der Browser diese Datei bei jeder Seitenaktualisierung herunter. – RaYell

0

Der andere Weg ist, JavaScript-Datei dynamisch zu laden. Ich meine so etwas wie diese

<script> 
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
ComponentLoad("/tree/AttributeTree.js"); //here Javascript file will be loaded 
</script> 

Aber auch das ist nicht die beste Lösung. Weil es viele globale Variablen geben wird. So besser, dies zu tun:

<script> 
ComponentLoad("/tree/AttributeTree.js","doSomethingRandom",{myVarToUse:"<asp:Literal runat="server" ID="HackyLiteral" />"}); //here Javascript file will be loaded 
</script> 
Verwandte Themen