2009-05-20 14 views
5

Usando C# para el desarrollo de ASP.NET y MOSS, a menudo tenemos que insertar JavaScript en nuestro código C#. Para lograr esto, parece que hay dos escuelas predominantes de pensamiento:¿Cómo incrusta otros lenguajes de programación en su código?

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

La otra escuela de pensamiento es algo como esto:

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

¿Hay una manera mejor que cualquiera de estos dos métodos? Me gusta el segundo personalmente, ya que puede ver toda la sección de JavaScript (u otro bloque de idioma, ya sea SQL o lo que sea), y también ayuda a copiar el código entre otro editor para ese idioma específico.

Editar:
Debo mencionar que el objetivo final es tener JavaScript formateado en la página web final.

También cambié el ejemplo para mostrar la interacción con el código generado.

+0

He tenido la intención de preguntar esto también. mientras que el segundo se ve más limpio, luego intente nombrar dinámicamente los controles ... luego se pone aún más feo ya que tiene que usar Control.ClientID –

+0

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

Respuesta

7

La segunda es, obviamente, mucho, mucho, más clara. Realmente no podría haber ninguna razón para hacer lo primero.

Quisiera, sin embargo, se extienden a esto:

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

Si tiene varias cosas para pegar dentro de la cadena, el método string.Format se convertirá en algo más legible que la concatenación en línea.

+0

es una muy buena sugerencia, aunque podría volverse difícil de manejar rápidamente con un montón de sustitutos. –

+1

¿Está codificando adecuadamente las cadenas que pone allí? ¿Qué pasa si hay un apóstrofo o una barra invertida allí? O, cielos no lo permiten, ¿un operador menor que? –

3

¿Qué le parece agregar el JavaScript como una sección de recursos al archivo, para que pueda cargarse como un script (incrustado) desde la sección de recursos del ejecutable?

+0

sí ... esto hace que sea difícil trabajar con él. ya están comenzando desde la desventaja de tener que trabajar con MOSS, lo mejor es hacer algo como esto en la mayoría de los casos. –

+0

No si organiza su código cuidadosamente. Mi experiencia es que, por lo general, solo hay unos pocos ID y que debe extraer del código del lado del servidor. Estos pueden insertarse en inicializadores incrustados de la misma manera que lo hace arriba. Si desea formatear y leer, use archivos JS. – Ishmael

+0

@ Ishmael, ¿me puede dar un ejemplo del uso de inicializadores con sus recursos? –

1

La cadena literal por una razón: legibilidad.

(rendimiento es un no-problema, esto es MOSS que estamos hablando ...)

+0

Esto se aplica a muchos idiomas, es decir, incrustando SQL en VB, por ejemplo. –

5

La segunda manera, aunque el uso de un archivo externo es mucho mejor y permite modificaciones en la aplicación sin volver a compilarlo.

También necesita una forma agradable y legible de insertar variables. El enfoque más simple es usar string.Format, pero cada variable es {0} o {1}, por lo que puede ser ilegible.

¿Qué tal:

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

entonces usted puede hacer esto:

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

O si el guión está en un archivo externo:

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

Puede pasar cualquier objeto y sus propiedades serán directamente accesibles a través de una sintaxis de escape de estilo ASP.

La implementación dada anteriormente no es muy eficiente, obviamente, pero es corta.

Otra posibilidad es escribir una página .aspx que devuelve JavaScript, y luego puede incluirla en sus páginas HTML con una referencia <script>. Puede set the ContentType of the page para ser application/x-javascript.

Esto le permitirá utilizar ASP.NET normales <%= %> etiquetas para modificarlo, y será ya una solución rápida y robusta con archivos externos, compilar automáticamente sobre la marcha cuando haga cambios al guión.

+0

¿Puedes dar un ejemplo para tenerlo en un archivo externo para evitar la recompilación? la respuesta proporcionada por ninguno mencionó ponerla en la sección de recursos del ejecutable, pero eso requeriría una recompilación para cambiarla. –

+0

He agregado un ejemplo muy simple de eso: es probable que desee utilizar las funciones de asignación de ruta ASP.NET si está compilando ese tipo de aplicación para ubicar el archivo dentro de su aplicación web. –

+0

Muy interesante. Me pregunto qué tan fácilmente esto se traduce al paradigma de MOSS Web Part/Solution ... –

1

Escribimos una biblioteca solo para este propósito, que ofrece una sintaxis fluida para incrustar JavaScript en el código C#. Puede leer más al respecto here.

En pocas palabras, su ejemplo podría ser escrito como:

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

Por un lado, se asegurará de que el contenido de la variable bla se cite adecuadamente, si contiene caracteres especiales, por ejemplo.

Cuestiones relacionadas