2010-06-10 6 views
5

Mi aplicación está diseñada como un host de complementos que aún no se han escrito. Hay una razón larga para esto, pero con cada nuevo año, la lógica comercial será diferente y no sabemos cómo será (piense en TurboTax si eso ayuda). Los complementos constan de componentes de servidor y cliente. Los componentes del servidor se ocupan de la lógica empresarial y persisten los datos en las tablas de la base de datos que se crearán más adelante. El JavaScript manipula el DOM para que los navegadores lo muestren después.¿Cuál es una forma limpia de que el servidor devuelva una función de JavaScript que luego se invocaría?

Cada complemento vive en un ensamblaje separado, para que no molesten a la aplicación principal, es decir, no queremos volver a compilar la aplicación principal. Para resumir, estoy buscando una forma de devolver las funciones de JavaScript al cliente desde una solicitud de obtención de Ajax, y ejecutar estas funciones de JavaScript (que acabo de devolver). Invocar una función en Javascript es fácil. La parte difícil es cómo organizar o estructurar para no tener que lidiar con un problema de mantenimiento. Entonces, concat usando StringBuilder para terminar con código JavaScript como resultado de llamar a String() desde el objeto del generador de cadenas está fuera de la cuestión.

No quiero diferenciar entre escribir normalmente códigos JavaScript y escribir códigos Javascript para este propósito dinámico.

Una alternativa es manipular el DOM en el lado del servidor, pero dudo que sea tan elegante como usar jQuery en el lado del cliente. Estoy abierto para una biblioteca de C# que admita llamadas encadenables como jQuery que también manipula el DOM.

¿Tiene alguna idea o es demasiado pedir o está demasiado confundido?

Edit1: El objetivo es evitar la recompilación, de ahí la arquitectura de los plugins. En algunas otras partes del programa, ya utilizo el concepto de cargar archivos Javascript de forma dinámica. Eso funciona bien Lo que estoy buscando aquí está en algún lugar en el medio del programa cuando se envía una solicitud de Ajax al servidor.

Editar 2: Para ilustrar mi pregunta:

Normalmente, se podría ver el siguiente código. Se envía una solicitud Ajax al servidor, se devuelve un resultado JSON al cliente que luego usa jQuery para manipular el DOM (crear una etiqueta y agregarla al contenedor en este caso).

var container = $('#some-existing-element-on-the-page'); 
$.ajax({ 
    type: 'get', 
    url: someUrl, 
    data: {'': ''}, 
    success: function(data) {             
     var ul = $('<ul>').appendTo(container); 

     var decoded = $.parseJSON(data);     
     $.each(decoded, function(i, e) { 
     var li = $('<li>').text(e.FIELD1 + ',' + e.FIELD2 + ',' + e.FIELD3) 
      .appendTo(ul); 
     });     
    }   
}); 

Lo anterior es extremadamente simple. Pero el próximo año, lo que el servidor devuelve es totalmente diferente y cómo los datos que se van a presentar también serán diferentes. En cierto modo, esto es lo que quiero:

var container = $('#some-existing-element-on-the-page'); 
$.ajax({ 
    type: 'get', 
    url: someUrl, 
    data: {'': ''}, 
    success: function(data) {       
     var decoded = $.parseJSON(data); 
     var fx = decoded.fx; 
     var data = decode.data; 
     //fx is the dynamic function that create the DOM from the data and append to the existing container 
     fx(container, data);     
    }   
}); 

No necesito saber, en este momento qué datos serían como, pero en el futuro lo haré, y luego puedo escribir fx en consecuencia.

Respuesta

0

Una idea tonta, pero ¿podría sugerirle que devuelva un href a un archivo JS externo y lo cargue en lugar de devolver el código JS real?

+0

Consulte las ediciones nuevas si pudieran aclararle la pregunta. –

1

Dudo que necesite el ajax para devolver el javascript y probablemente pueda simplemente cambiar los archivos .js cada año.

Tenga en cuenta que tendrá que ser firmado las secuencias de comandos si se encuentran varios dominios

De todos modos, usted está probablemente en busca de EVAL, que en teoría podría ser utilizado por los hackers para meterse con su sitio.También ralentizaría las cosas y dificultaría la depuración ...

De nuevo, probablemente no necesite cargar javascript de forma asíncrona. Si la lógica cambia todos los años, eso solo está cambiando los archivos .js. Tendría que cargarlo con ajax si la lógica cambiara mientras el navegador aún estaba en la página ... lo que podría causar un problema en los espacios de nombres de programación de todos modos. (es decir, introduce un código nuevo en el espacio de nombres en vivo del código anterior, y las versiones no funcionan bien).

+0

@ user257493: el dominio cruzado no es un problema. eval también es un problema. No cambiamos el archivo js cada año, tendremos que agregar otros nuevos. Todavía tenemos que procesar datos de muchos años en el pasado. El objetivo es evitar la recompilación, de ahí el motivo de los complementos. –

+0

JS isnt compiled. Puedes minifijar pero eso es todo. ¿Desea hacer esto? http://www.webdeveloper.com/forum/showthread.php?t=129579 – Incognito

+0

Acabo de ver esto en línea ... http://experimentgarden.com/loading-javascript-functions-via-ajax Puede encontrarlo relacionado con su pregunta. – Incognito

0

Parece que ya se ha decidido por su arquitectura y está decidido a encontrar la manera de hacerlo funcionar. Pero en lugar de modificar el DOM directamente, ¿por qué no simplemente hacer que los complementos devuelvan el HTML relevante y actualicen el innerHTML del contenedor con su resultado?

+0

agradece su respuesta. Creo que el esfuerzo para construir el html en el lado del servidor (y actualizar innerHTML en el cliente como dijiste) haría que el código fuera mucho menos sostenible a largo plazo. Será un StringBuilder largo con muchas llamadas Append() en el mejor de los casos. Dentro de cada una de estas llamadas anexadas, habrá corchetes abiertos (<) y cerrados (>) en todos los lugares. –

+0

@Khnle: también podría usar un lado del servidor HtmlTextWriter. Estos tienden a ser muy detallados, pero al menos no tienes que mirar esos soportes desagradables. – Ishmael

0

Bueno, el cop-out simplemente está utilizando eval. Enviando la función como cadena desde el servidor y eval ('myhopefullyuncompromisedjavascriptcode');

success: function(data) { 
var decoded = $.parseJSON(data); 
    var fx = eval(decoded.fx); 
    //where the eval string would contain "(function(params){...})" 
    var data = decode.data; 
    //fx is the dynamic function that creates the DOM from the data and append to the existing container 
    fx(container, data);  

Sin embargo, las alternativas no son mucho mayores.

Puede cargar a pedido pero, en realidad, es lo mismo, excepto que está encapsulado en .js.
Si alguien tiene la capacidad de devolver js ensartadas al azar desde su sitio, o puede hacer que su punto de llamada ajax en otro lugar cargue js arbitrarios, entonces ya pueden cargar sus propios js arbitrarios.

Por otro lado, la carga dinámica podría ahorrarle algo de peso, ya que no está enviando la misma función por cable y la evalúa una y otra vez, ese mismo beneficio podría derivarse de mantener un hash del lado del cliente funciones sin embargo.

es un poco 'meh' de mi punto de vista.

Cuestiones relacionadas