[ASP] Dynamisch includen : De oplossing

Pagina: 1
Acties:

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik lees heel vaak topics hier op GoT over mensen die dynamisch willen includen.

Meestal krijg je brakke antwoorden als :
Doe het met if-jes. Nogal rot aangezien echt dynamisch includen er hier niet bij is!
Visual Basic:
1
2
3
4
5
<% if var = 1 then %>
<!--#include file="deze.asp" -->
<% else %>
<!--#include file="de_andere.asp" -->
<% end if %>


Manier 2 is uiteraard de Server.execute methode! ook heel netjes en lijkt de oplossing te zijn... maar als snel kom je erachter dat je problemen krijgt, met variabelen van de uitvoerende pagina die je op de geinclude pagina wilt gebruiken. Dat is onmogelijk namelijk!

Nu weet ik niet of dit al bekend was onder de meesten hier maar ik wil het jullie toch mededelen (misschien handig voor in de faq)

Hier een oplossing om het vorige probleem te ontwijken!
Je opent met een Streamreader een bestand en leest dit uit en execute dit gewoon op de huidige pagina!
Visual Basic:
1
2
3
4
Set objFS = Server.CreateObject("Scripting.FileSystemObject")
Set objFL = objFS.GetFile(absolute_path_of_file)
Set objTS = objFL.OpenAsTextStream(1,0)
Execute(objTS.Read(objFL.Size))


Je kunt nu dit doen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
page1.asp
-----------------------------------
originalvar = "jaja kan dit ???"

Set objFS = Server.CreateObject("Scripting.FileSystemObject")
Set objFL = objFS.GetFile(server.MapPath(".") & "\page2.asp")
Set objTS = objFL.OpenAsTextStream(1,0)
Execute(objTS.Read(objFL.Size))

Response.write(var1)
-----------------------------------


page2.asp
-----------------------------------
var1 = "lalalalala WORKING!!" 
Response.Write(originalvar)
-----------------------------------


output:
-----------------------------------
jaja kan dit ???lalalalala WORKING!!
-----------------------------------
Ik weet niet wat voor versie iis/asp je hier voor nodig hebt maar het werkt onder IIS5/ASP3.0 gewoon perfect!

Zie maar wat je met dit topic doet. ik wilde het gewoon even mededelen aangezien je hier nogal eens een topic over tegenkomt!

EDIT/ Nadelen zijn wel dat je VOLLEDIGE geinclude bestand asp moet zijn.
EDIT2/ Functies zijn ook beperkt aan te roepen!!!

[ Voor 14% gewijzigd door Mischa_NL op 11-04-2005 20:20 ]


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Cachen zal er ook niet bij zijn. :o

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dit is vanuit een performance oogpunt natuurlijk verschrikkelijk. De parser moet stoppen met het huidige script, het nieuwe script inlezen en daarna weer verder gaan met het oude.

Ik zou het absoluut niet doen

Oops! Google Chrome could not find www.rijks%20museum.nl


  • DRAFTER86
  • Registratie: April 2002
  • Laatst online: 15:24
P_de_B schreef op dinsdag 12 april 2005 @ 08:12:
Dit is vanuit een performance oogpunt natuurlijk verschrikkelijk. De parser moet stoppen met het huidige script, het nieuwe script inlezen en daarna weer verder gaan met het oude.
Dat lijkt me meestal het geval bij een include. (ook bij bijvoorbeeld PHP)

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Pagina's worden 2x geparsed, eerst worden de includes gelezen en daarna wordt de hele bups verwerkt.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
DRAFTER86 schreef op dinsdag 12 april 2005 @ 08:21:
[...]


Dat lijkt me meestal het geval bij een include. (ook bij bijvoorbeeld PHP)
Nee, de includes op de 'normale' manier worden (iig bij ASP) ge-included voordat het script naar de interpreter gaat.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Dukey
  • Registratie: November 2000
  • Laatst online: 12-04 22:43

Dukey

Ik heb dit getypt hier -->

Ik gebruik server.execute bij bijna alle websites die ik tot nu toe heb gemaakt, sinds ik er zelf ben achter gekomen dat includes niet dynamisch zijn. Een variable die percé mee moet geef ik mee via een sessie of vang hem met een querystring :z .

Hoe zit dit eigenlijk bij ASP.NET, werkt dat dan nog steeds zo?

Ook wel de allergrootste _ _ _ _ _ (vul in met blokletters)


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Djoekie schreef op dinsdag 12 april 2005 @ 09:08:
Ik gebruik server.execute bij bijna alle websites die ik tot nu toe heb gemaakt, sinds ik er zelf ben achter gekomen dat includes niet dynamisch zijn. Een variable die percé mee moet geef ik mee via een sessie of vang hem met een querystring :z .

Hoe zit dit eigenlijk bij ASP.NET, werkt dat dan nog steeds zo?
Ook voor server.execute geldt dat het performance technisch niet een goede oplossing is. Bij kleine sites zul je het probleem niet merken, maar het is niet echt aan te raden.


Ik begrijp het probleem van dynamische includes ook niet echt, je kunt er toch vaak op een andere manier wel om heen? Desnoods 1 include met wat IF statements, dat zal allicht sneller gaan dan met FSO een file inlezen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • party42
  • Registratie: Oktober 2000
  • Laatst online: 12:13
je zou er ook voor kunnen kiezen in een include functies te plaatsen en deze functies wel of niet uit te voeren.

Everyday's an endless stream, of cigarettes and magazines...


  • Timmio
  • Registratie: November 2003
  • Niet online
Zelf zie ik het probleem met de soort 'if' ook niet. Ik gebruik veel dynamische includes in een grote en druk bezochte website. Ik doe dit echt wel met Select Case en niet If.. Volgens mij gaat dit prima, alleen is het tijdens het ontwerp een beetje een zooitje..

Dat standaard includen en dan kijken welke functie wel/niet gebruiken is op zich wel een aardig idee, alleen dan mis ik zelf de hoofdrede van het includen. Dan kan ik net zo goed alles in 1 file kwakken ipv losse bestanden. (en dan dus alleen het voordeel hebben dat losse files minder code geven dan wanneer ik 1 bestand gebruik, ik gebruik include juist ook voor andere voordelen)

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Timmio schreef op dinsdag 12 april 2005 @ 10:32:
Zelf zie ik het probleem met de soort 'if' ook niet. Ik gebruik veel dynamische includes in een grote en druk bezochte website. Ik doe dit echt wel met Select Case en niet If.. Volgens mij gaat dit prima, alleen is het tijdens het ontwerp een beetje een zooitje..

Dat standaard includen en dan kijken welke functie wel/niet gebruiken is op zich wel een aardig idee, alleen dan mis ik zelf de hoofdrede van het includen. Dan kan ik net zo goed alles in 1 file kwakken ipv losse bestanden. (en dan dus alleen het voordeel hebben dat losse files minder code geven dan wanneer ik 1 bestand gebruik, ik gebruik include juist ook voor andere voordelen)
Dit werkt dus niet als je als je ECHT dynamisch moet includen van bestanden die van te voren niet bekend zijn kwa path name...

En wat mijn script doet is gewoon een textbestand openen en executen in de huidige pagina. Ik zie het performance probleem niet?
Plus dat je geen problemen hebt met de scope van vars zoals bij server.execute!
Verder kun je ook functie's uit het geinclude bestand aanroepen wat met server.execute ook neit mogelijk is !

Ik zal eens ff een performance test doen en hier de resultaten posten!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Mischa_NL schreef op dinsdag 12 april 2005 @ 14:58:
[...]

En wat mijn script doet is gewoon een textbestand openen en executen in de huidige pagina. Ik zie het performance probleem niet?
:o je ziet geen performance problemen als je script een textbestand moet openen, deze eerst apart moet parsen en dan verder gaan met de rest van de pagina?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
code:
1
2
included file:
Response.Write("include!<br />")


De file hierboven heb ik als include file gebruikt! Met <% %> erom bij server.execute en zonder op mijn methode! (je kunt uiteraard ook <% en %> replacen door "")

10 Includes
Mijn manierServer.Execute
00
00
00
00
00
Avg: 0Avg: 0


100 Includes
Mijn manierServer.Execute
0.03120
0.03120
0.03120
0.03520
0.03520
Avg: 0.0328Avg: 0


1000 Includes
Mijn manierServer.Execute
0.28120,0664
0.31250,0625
0.28120,0781
0.32810,0781
0.32810,0781
Avg: 0.3062Avg: 0.0726


Ik heb gewoon geinclude in een loopje en de tijd gemeten!
De gewone include is uiteraard niet te meten omdat deze geparsed word VOORDAT asp geparsed word en dus maar 1 keer geinclude word ook als je het in een loop zet ;)

En ik bedoel... Wat is nou ongeveer 0.25 seconde op 1000 includes...
We hebben het hier over een kwart seconde!!!

Ik weet dat dit niet helemaal correcte getallen zijn omdat include tijd op mijn manier wel afhankelijk is van de grote van het bestand...

Op mijn manier kun je dus ook functies aanroepen in een dynamisch geinclude bestand en variabelen van de ene op de andere pagina gebruiken!

Het lijkt mij dus echt de oplossing voor het dynamisch include probleem bij ASP!

EDIT/
P_de_B schreef op dinsdag 12 april 2005 @ 15:18:
:o je ziet geen performance problemen als je script een textbestand moet openen, deze eerst apart moet parsen en dan verder gaan met de rest van de pagina?
Er word volgens mij niet apart geparsed op deze manier... Hij execute het gewoon als de rest van de pagina... net als een gewone include zou doen. Je hebt een string en deze gebruik je als asp code.
En ja het openen van een textbestand is iets slomer, maar de voordelen tegenover server.execute zijn toch wel redelijk groot lijkt me!

[ Voor 13% gewijzigd door Mischa_NL op 12-04-2005 15:39 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 11:55

mulder

ik spuug op het trottoir

Timmio schreef op dinsdag 12 april 2005 @ 10:32:
Zelf zie ik het probleem met de soort 'if' ook niet. Ik gebruik veel dynamische includes in een grote en druk bezochte website. Ik doe dit echt wel met Select Case en niet If.. Volgens mij gaat dit prima, alleen is het tijdens het ontwerp een beetje een zooitje..
Bovendien worden ALLE includes geparsed, dit is een zeer onwenselijke situatie.
Zelf gebruik ik buiten de eerder genoemde truukjes, nog de XmlServerHTTP nog om scripts te includen.

Dynamisch en ASP zijn twee woorden die eigenlijk niet bij elkaar horen, gewoon kut geregeld.

oogjes open, snaveltjes dicht


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Nou, als jij hier tevreden mee bent moet je het gewoon doen :)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Sorry voor de kick ik weet niet of dat nog mag maar ik doe het toch :P.

De uiteindelijke functie:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public function Include(sourcefile)

    Set fs=Server.CreateObject("Scripting.FileSystemObject")

    If (fs.FileExists(Server.MapPath(".") & "\" & sourcefile))= true Then
        
        dim strfile
        Set objFS = Server.CreateObject("Scripting.FileSystemObject")
        Set objFL = objFS.GetFile(Server.MapPath(".") & "\" & sourcefile)
        Set objTS = objFL.OpenAsTextStream(1,0)
        strfile = objTS.Read(objFL.Size)
        
        'why cant i replace % >
        strfile = replace(strfile,"<", "&lt;")
        strfile = replace(strfile,">", "&gt;")
        strfile = replace(strfile,"%&gt;","")
        strfile = replace(strfile,"&lt;%","")
        strfile = replace(strfile,"&lt;", "<")
        strfile = replace(strfile,"&gt;", ">")

        ExecuteGlobal(strfile)

    Else
        Response.Write("File " & sourcefile & " does not exist.")
        response.end
    End If
    
end function


page1:
Visual Basic:
1
2
3
4
5
6
<!--#include file="includes/includefunction.asp"-->
<%
include("page2.asp")
Response.Write(var1 & "<br />")
Call hello("Functie testen!")
%>
page2:
Visual Basic:
1
2
3
4
5
6
7
<%
private function hello(include)
    Response.Write(include)
end function

var1 = "variabele testen"
%>


Output: http://www.garbitch.nl/page1.asp


Het enige waar ik niet uitkom is dit:
strfile = replace(strfile,"%>","")
strfile = replace(strfile,"<%","")

Waarom werkt dat niet gewoon???

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
%> is een bijzondere combinatie die niet naar de parser gaat, het is juist als delimiter bedoeld om code en html te scheiden.

Nogmaals, vanuit een performance oogpunt is dit niet echt een goede oplossing.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1