2009-01-26 21 views
7

Es decir, al igual que php'h incluyen ...¿es posible emitir dynamic include en asp-classic?

algo así como

 
my_file_to_be_included = "include_me.asp" 

-- > 

por lo que he visto hasta ahora, hay un par de alternativas, pero cada uno de ellos tiene algún tipo de deficiencia ...

Lo que estoy tratando de averiguar es cómo hacer un sistema de plantilla flexible ... sin tener que incluir estáticamente todo en un solo archivo con una declaración de caso loooooong ...

aquí hay un par de o f enlaces

a solution using FileSysmemObject, just lets you include static pages

idem

yet another one

same thing from adobe

this approach uses Server.Execute

pero tiene algunas deficiencias que me gustaría evitar ... que parece ser (paraíso' t intentó aún) Server.Execute código se ejecuta en anoth er contexto, por lo que no se puede utilizar para cargar un funciones de su tienen previsto utilizar en el código de llamada ... desagradables ...

same thing

I think this one is the same

this looks promising!!!

I No estoy seguro al respecto (no pude probarlo todavía) pero parece que este maneja dinamicamente la página a un componente SSDI ...

alguna idea ???

+0

[4guysfromrolla] (http://www.4guysfromrolla.com/) tiene una muy buena [artículo] (http: // www. 4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2F022504-1.shtml) en esto. –

+0

Debe buscar en [ExecuteGlobal] (http://msdn.microsoft.com/en-us/library/342311f1 (VS.85) .aspx). Vea el ejemplo 3 en [Usando ExecuteGlobal para incluir el código de VBScript] (http://www.gwmicro.com/Support/Knowledge_Base/?kbnumber=GWKB2035) – loraderon

+0

No obstante, Server.Execute funcionó muy bien para mí al escribir un sistema de Templating dinámico, porque nunca se esperaba que los propios archivos de plantilla añadieran nuevas funciones/per se /. Sin embargo, tuve que insertar un objeto en una Sesión var para pasarlo al archivo "incluido". Así que ... para abreviar, su pregunta fue útil para mí, incluso si nunca obtuvo lo que estaba buscando. :-) –

Respuesta

5

No, no se puede hacer una inclusión dinámica, punto.

Su mejor oportunidad en esto es una Server.Execute y pasando el estado en que necesita a través de una variable de sesión: -

Session("callParams") = BuildMyParams() 'Creates some sort of string 
Server.Execute(my_file_to_be_included) 
Session.Contents.Remove("callParams") 
+1

PUEDE hacer inclusiones dinámicas. Eche un vistazo a la siguiente técnica ... – atwrok8

+0

@ atwrok8: No creo que haya entendido correctamente la distinción entre una ejecución y una inclusión. – AnthonyWJones

+1

Entiendo perfectamente la distinción entre Server.Execute y la directiva #include. El hecho de que se use el término "incluir dinámico" no significa que tenga algo que ver con la directiva #include. Con respecto al ASP clásico, el término "incluir dinámico" se usa casi siempre para describir el problema de utilizar un fragmento de código de forma dinámica, en función de alguna lógica de tiempo de ejecución. Los enlaces proporcionados por opensas apuntan a varias soluciones a este problema, y ​​estoy casi seguro de que opensas no está preguntando específicamente sobre la directiva #include. – atwrok8

0

estoy un poco oxidado en ASP clásico, pero estoy bastante seguro de que puede usar el método Server.Execute para leer en otra página asp y luego continuar ejecutando la página de llamada. 15Segundos tuvieron algo de basic stuff al respecto - me lleva de vuelta ...

+0

Enlace muerto. Esta es la razón por la que la información debe incluirse en la respuesta en lugar de estar vinculada a: -/ –

1

Claro que puedes hacer REAL classic asp dynamic includes. Hace un tiempo escribí esto y me ha abierto ASP clásico de una forma completamente nueva. Hará exactamente lo que está buscando, ¡aunque las personas parezcan pensar que no es posible!

Cualquier problema simplemente hágamelo saber.

+1

@atwork: Esto no incluye una inclusión y para el registro simplemente itera lo que ya he indicado en mi respuesta lo más cerca que puede obtener Es un Servidor. Ejecutar. Hay una diferencia importante entre un Execute y un Include. Una ejecución utiliza un nuevo contexto de script nuevo, todo el código y las variables se incluyen en ese contexto para la página ejecutada. Una inserción incluye código en la secuencia de comandos actual (antes de que cualquier código ejecute una acción estática) y luego todo el código se ejecuta en el mismo contexto, compartiendo variables y funciones. – AnthonyWJones

+0

Voy a echarle un vistazo ... – opensas

+0

@ atwrok8 - ¿Hay alguna posibilidad de que puedas incluir ese código a través de otro enlace o actualizar tu respuesta para incluirlo? Enlace muerto –

0

Estoy construyendo un sitio web en el que hubiera sido conveniente poder utilizar inclusiones dinámicas. El sitio es todo ajax (sin recargas de página) y aunque las llamadas de retorno JSON de datos puros no lo necesitaban, todos los diferentes contenidos html para cada subparte de aplicación diferente (ventana/panel/área/formulario, etc.) me parece mejor estar en diferentes archivos.

Mi idea inicial era hacer que la llamada ajax volviera al archivo principal "hub central" (que quita la aplicación en primer lugar), que luego sabría qué subarchivo incluir. ¡Simplemente incluir todos los archivos no funcionaba después de darme cuenta de que cada llamada para una pieza posiblemente pequeña tendría que analizar todo el código ASP de todo el sitio! Y usar el método Execute no fue bueno, tanto en términos de velocidad como de mantenimiento.

Resolví el problema al hacer que las supuestas páginas "secundarias" fueran las páginas principales, e incluir el archivo "concentrador central" en cada una. Básicamente, es un javascript de ida y vuelta incluido.

Esto es menos costoso de lo que parece, ya que la idea de una página web es que el servidor responda a las solicitudes de los clientes para "la página siguiente" todo el tiempo. El contenido que se solicita se define en el alcance de la página que se llama.

El único inconveniente de esto es que los "elementos web" de la aplicación tienen que vivir parcialmente divididos: la mayor parte de su contenido en un archivo .asp llamado real, pero lo suficiente de su estructura y relación definida en la principal. asp file (de modo que, por ejemplo, un elemento de menú en un elemento web sepa el nombre que se utilizará para llamar o cargar otro elemento web y cómo se debe realizar esa carga). De alguna manera, sin embargo, esto sigue siendo una ventaja sobre un sitio tradicional donde cada página tiene que saber cómo cargar cada otra página. Ahora puedo hacer cosas como "cargar esta parte (ya sea en una página completa o de otra manera) de la misma forma en que quiere que se cargue".

También configuré para que cada parte tenga su propia javascript y css (si solo esa parte necesita esas cosas). Luego, esos archivos se incluyen dinámicamente a través de javascript solo la primera vez que se carga esa parte. Entonces, si la pieza se carga repetidamente, no incurrirá en una sobrecarga adicional.

2

Versión mejorada (v2.0):

<% 
' **** Dynamic ASP include v.2.0 

function fixInclude(content) 
    out="" 
    if instr(content,"#include ")>0 then 
     response.write "Error: include directive not permitted!" 
     response.end 
    end if  
    content=replace(content,"<"&"%=","<"&"%response.write ") 
    pos1=instr(content,"<%") 
    pos2=instr(content,"%"& ">") 
    if pos1>0 then 
     before= mid(content,1,pos1-1) 
     before=replace(before,"""","""""") 
     before=replace(before,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""") 
     before=vbcrlf & "response.write """ & before & """" &vbcrlf 
     middle= mid(content,pos1+2,(pos2-pos1-2)) 
     after=mid(content,pos2+2,len(content)) 
     out=before & middle & fixInclude(after) 
    else 
     content=replace(content,"""","""""") 
     content=replace(content,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""") 
     out=vbcrlf & "response.write """ & content &"""" 
    end if 
    fixInclude=out 
end function 

Function getMappedFileAsString(byVal strFilename) 
    Dim fso,td 
    Set fso = Server.CreateObject("Scripting.FilesystemObject") 
    Set ts = fso.OpenTextFile(Server.MapPath(strFilename), 1) 
    getMappedFileAsString = ts.ReadAll 
    ts.close 
    Set ts = nothing 
    Set fso = Nothing 
End Function 

execute (fixInclude(getMappedFileAsString("included.asp"))) 
%> 
+3

si ha mejorado su última respuesta, le sugiero que simplemente edite la anterior, sin agregar una nueva –

0

Así como una nota adicional. Obtenía extraños caracteres ASCII en la parte superior de las páginas que usaban Dynamic includes, así que descubrí que usar un objeto ADODB.Stream para leer el archivo de inclusión eliminó este problema.

Así que mi código actualizado para la función getMappedFileAsString es el siguiente

Function getMappedFileAsString(byVal strFilename) 
    Dim fso 
    Set fso = CreateObject("ADODB.Stream") 

    fso.CharSet = "utf-8" 
    fso.Open 
    fso.LoadFromFile(Server.MapPath(strFilename)) 

    getMappedFileAsString = fso.ReadText() 

    'Response.write(getMappedFileAsString) 
    'Response.End 

    Set fso = Nothing 
End Function 
Cuestiones relacionadas