2009-05-20 7 views
5

Usando C# per lo sviluppo di ASP.NET e MOSS, spesso dobbiamo incorporare JavaScript nel nostro codice C#. Per fare questo, sembra che ci sia due scuole prevalenti di pensiero:Come si incorporano altri linguaggi di programmazione nel codice?

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>"); 

L'altra scuola di pensiero è qualcosa di simile:

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

C'è un modo migliore di uno di questi due metodi? Mi piace il secondo personalmente, dato che puoi vedere l'intera sezione di JavaScript (o altro blocco di lingua, se SQL o cosa hai), e aiuta anche a copiare il codice tra un altro editor per quella specifica lingua.

Modifica:
Devo dire che l'obiettivo finale è avere JavaScript formattato nella pagina web finale.

Ho anche modificato l'esempio per mostrare l'interazione con il codice generato.

+0

Ho intenzione di chiedere anche questo. mentre il secondo sembra più pulito, dopo prova con la denominazione dinamica dei controlli ... poi diventa ancora più brutto dato che devi usare Control.ClientID –

+0

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

risposta

7

Il secondo è, ovviamente, molto, molto, più chiaro. Non potrebbe esserci davvero alcuna ragione per fare il primo.

Vorrei, tuttavia, estenderlo a questo:

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

Se avete parecchie cose da attaccare all'interno della stringa, il metodo string.Format diventerà un po 'più leggibile rispetto concatenazione di linea.

+0

questo è un ottimo suggerimento, anche se potrebbe diventare ingombrante rapidamente con un mucchio di sostituti. –

+1

Quindi stai codificando correttamente le stringhe che hai inserito? Cosa succede se c'è un apostrofo o una barra rovesciata? O, cieli proibisce, un operatore meno di? –

3

Come aggiungere il JavaScript come una sezione di risorse al file, in modo che possa essere caricato come uno script (incorporato) dalla sezione delle risorse dell'eseguibile?

+0

sì .. questo rende solo difficile lavorare con. stanno già iniziando da uno svantaggio di dover lavorare con MOSS, è meglio fare solo qualcosa di simile nella maggior parte dei casi. –

+0

Non se organizzi attentamente il tuo codice. La mia esperienza è che di solito ci sono solo pochi ID e che è necessario estrarre dal codice lato server. Questi possono essere inseriti in inizializzatori incorporati come fai sopra. Se si desidera la formattazione e la leggibilità, utilizzare i file JS. – Ishmael

+0

@Ishmael, puoi fornire un esempio di utilizzo degli inizializzatori con le tue risorse? –

1

La stringa letterale per un motivo: leggibilità.

(performance è un non-problema, questo è MOSS stiamo parlando ...)

+0

Questo vale per molte lingue, ad esempio l'incorporamento di SQL in VB. –

5

Il secondo modo, anche se l'utilizzo di un file esterno è molto meglio e consente di apportare modifiche all'applicazione senza ricompilarlo tutto.

È inoltre necessario un modo piacevole e leggibile per inserire variabili. L'approccio più semplice è usare string.Format, ma ogni variabile è {0} o {1} e quindi può essere illeggibile.

ne dite:

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; 
} 

Poi si può fare questo:

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

O se lo script è in un file esterno:

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

è possibile passare qualsiasi oggetto e le sue proprietà saranno direttamente accessibili tramite una sintassi di escape in stile ASP.

L'implementazione di cui sopra non è molto efficiente, ovviamente, ma è breve.

Un'altra possibilità è scrivere una pagina .aspx che restituisce JavaScript e quindi è possibile includerla nelle pagine HTML con un riferimento <script>. È possibile set the ContentType of the page per essere application/x-javascript.

Ciò consente di utilizzare i normali tag ASP.NET <%= %> per modificarlo e sarà già una soluzione rapida e affidabile con file esterni, che vengono compilati automaticamente al volo quando si apportano modifiche allo script.

+0

Puoi dare un esempio per averlo in un file esterno per evitare la ricompilazione? la risposta fornita da nessuno menzionato mettendolo nella sezione delle risorse dell'eseguibile, ma che richiederebbe una ricompilazione per cambiarlo. –

+0

Ho aggiunto un esempio molto semplice di questo: probabilmente dovresti utilizzare le funzioni di mappatura del percorso di ASP.NET se stai realizzando quel tipo di app, per individuare il file all'interno della tua app web. –

+0

Molto interessante. Mi chiedo quanto facilmente questo si traduce nel paradigma Web Part/Solution di MOSS ... –

1

Abbiamo scritto una libreria solo per questo scopo, che offre una sintassi fluente per incorporare JavaScript nel codice C#. Puoi leggere di più a riguardo here.

In breve, il tuo esempio potrebbe essere scritto come:

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

Per uno, farà in modo che il contenuto della variabile bla sia correttamente citato, se contiene caratteri speciali, per esempio.

Problemi correlati