2009-05-20 9 views
5

Mit C# für ASP.NET und MOSS-Entwicklung müssen wir JavaScript oft in unseren C# -Code einbetten. Um dies zu erreichen, scheint es zwei vorherrschende Denkschulen zu sein:Wie betten Sie andere Programmiersprachen in Ihren Code ein?

string blah = "asdf"; 
StringBuilder someJavaScript = new StringBuilder(); 
someJavaScript.Append("<script language='JavaScript' >"); 
someJavaScript.Append("function foo()\n"); 
someJavaScript.Append("{\n"); 
someJavaScript.Append(" var bar = '{0}';\n", blah); 
someJavaScript.Append("}\n"); 
someJavaScript.Append("</script>"); 

Die andere Denkschule ist so etwas wie diese:

string blah = "asdf"; 
string someJavaScript = @" 
    <script language='JavaScript' > 
    function foo() 
    { 
     var bar = '" + blah + @"'; 
    } 
    </script>"; 

Gibt es einen besseren Weg, als eine dieser beiden Methoden? Ich mag den zweiten persönlich, wie Sie den gesamten Abschnitt von JavaScript (oder anderen Sprachblock, ob SQL oder was Sie haben) sehen, und es hilft auch beim Kopieren des Codes zwischen einem anderen Editor für die jeweilige Sprache.

Edit:
Ich sollte erwähnen, dass das Endziel JavaScript in der endgültigen Webseite formatiert ist.

Ich änderte auch das Beispiel, um Interaktion mit dem generierten Code anzuzeigen.

+0

Ich wollte das auch fragen. während der zweite sauberer aussieht, als nächstes versuchen dynamische Benennung von Steuerelementen ... dann wird es noch hässlicher, da Sie Control.ClientID verwenden müssen –

+0

document.getElementById ("" + String.Format ("{0} _ {1}" , Base.ClientID, "Foobar") + @ "" ") .... –

Antwort

7

Der zweite Weg ist offensichtlich, Art und Weise, klarer. Es konnte wirklich keinen Grund geben, den ersten zu machen.

Ich würde jedoch verlängern sie dies:

string someJavaScript = string.Format(@" 
    <script language='JavaScript' > 
     function foo() 
     { 
      var bar = '{0}'; 
     } 
    </script>", blah); 

Wenn Sie mehrere Dinge innerhalb der Zeichenfolge zu halten, werden die string.Format Methode besser lesbar werden, anstatt Inline-Verkettung.

+0

das ist ein sehr guter Vorschlag, obwohl es schnell mit einer Reihe von Substituten unhandlich werden könnte. –

+1

Also codierst du die Strings, die du dort eingibst, richtig? Was ist, wenn da ein Apostroph oder ein Backslash ist? Oder, Himmel verbieten, ein weniger als Operator? –

3

Wie fügt man der Datei das JavaScript als Resource-Abschnitt hinzu, so dass es als ein (eingebettetes) Skript aus dem Resource-Abschnitt der ausführbaren Datei geladen werden kann?

+0

ja .. das macht es nur schwer mit zu arbeiten. Sie beginnen bereits mit dem Nachteil, dass sie mit MOSS arbeiten müssen. In den meisten Fällen ist es am besten, so etwas zu tun. –

+0

Nicht, wenn Sie Ihren Code sorgfältig organisieren. Meine Erfahrung ist, dass es normalerweise nur ein paar IDs gibt und dass Sie vom serverseitigen Code abziehen müssen. Diese können in Initialisierungen eingebettet werden, wie Sie es oben getan haben. Wenn Sie formatieren und lesen möchten, verwenden Sie JS-Dateien. – Ishmael

+0

@Ishmael, können Sie ein Beispiel für die Verwendung von Initialisatoren mit Ihren Ressourcen bereitstellen? –

1

Das String-Literal aus einem Grund: Lesbarkeit.

(Performance ist kein Thema, das ist MOSS wir reden ...)

+0

Dies gilt für viele Sprachen, dh - Einbetten von SQL in VB zum Beispiel. –

5

Die zweite Möglichkeit, obwohl eine externe Datei verwendet wird, ist viel besser und ermöglicht Änderungen an der Anwendung vorgenommen werden, ohne alles neu zu kompilieren.

Sie benötigen auch eine schöne, lesbare Möglichkeit, Variablen einzufügen. Der einfachste Ansatz ist die Verwendung von string.Format, aber dann ist jede Variable {0} oder {1} und kann daher nicht lesbar sein.

Wie wäre:

public static string Insert(object dictionary, string into) 
{ 
    foreach (PropertyInfo property in dictionary.GetType().GetProperties()) 
     into = into.Replace("<%" + property.Name + "%>", 
          property.GetValue(dictionary, null).ToString()); 

    return into; 
} 

Dann können Sie dies tun:

string js = Insert(new { divList, url }, 
        @"jQuery(document).ready(function(){ 
         jQuery('#<%divList%>').jqGrid({ 
          url:'<%url%>', 
          datatype: 'json', 
          mtype: 'GET', ... etc..."); 

Oder, wenn das Skript in einer externen Datei ist:

string js = Insert(new { divList, url }, File.ReadAllText("someFile.js")); 

Sie können ein beliebiges Objekt übergeben und Seine Eigenschaften sind direkt über eine ASP-artige Escape-Syntax zugänglich.

Die obige Implementierung ist natürlich nicht sehr effizient, aber sie ist kurz.

Eine andere Möglichkeit besteht darin, eine ASPX-Seite zu schreiben, die JavaScript zurückgibt, und Sie können sie dann in Ihre HTML-Seiten mit einer <script>-Referenz einfügen. Sie können set the ContentType of the pageapplication/x-javascript sein.

Dadurch können Sie normale ASP.NET <%= %> Tags verwenden, um es zu ändern, und wird bereits eine schnelle, robuste Lösung mit externen Dateien sein, automatisch kompilieren, wenn Sie Änderungen am Skript vornehmen.

+0

Können Sie ein Beispiel geben, um es in einer externen Datei zu haben, um die Neukompilierung zu vermeiden? Die Antwort, die von keiner zur Verfügung gestellt wird, erwähnt das Einfügen in den Ressourcenabschnitt der ausführbaren Datei, aber das würde eine Neukompilierung erfordern, um sie zu ändern. –

+0

Ich habe ein sehr einfaches Beispiel dafür hinzugefügt - Sie möchten wahrscheinlich die ASP.NET-Pfadzuordnungsfunktionen verwenden, wenn Sie diese Art von App erstellen, um die Datei in Ihrer Webanwendung zu finden. –

+0

Sehr interessant. Ich frage mich, wie leicht sich das auf das MOSS Web Part/Solution Paradigma überträgt ... –

1

Wir haben eine Bibliothek nur für diesen Zweck geschrieben, die eine fließende Syntax zum Einbetten von JavaScript in C# -Code bietet. Sie können mehr darüber lesen here.

Kurz gesagt, Ihr Beispiel geschrieben werden würde, wie:

var function = JS.Function("foo").Do(
    JS.Var(JS.Id("bar").AssignWith(blah))); 
string someJavaScript = "<script>" + function + "</script>"; 

Zum einen wird es sicher, dass der Inhalt der Variable blah richtig zitiert wird, wenn es Sonderzeichen enthält, zum Beispiel.

Verwandte Themen