2009-01-26 6 views
7

Je veux dire, comme php'h comprennent ...est-il possible d'émettre dynamique inclure dans asp-classic?

quelque chose comme

 
my_file_to_be_included = "include_me.asp" 

-- > 

pour ce que j'ai vu jusqu'à présent, il y a deux alternatives, mais chacun d'eux a une sorte de carence ...

ce que je suis en train de comprendre comment faire un système de modèle souple ... sans avoir à inclure statiquement le tout dans un seul fichier avec une instruction case loooooong ...

ici il y a un couple o f liens

a solution using FileSysmemObject, just lets you include static pages

idem

yet another one

same thing from adobe

this approach uses Server.Execute

mais il a quelques défauts que je voudrais éviter ... semble être (havre de paix » t essayé encore) Server.Execute code fonctionne dans anoth er contexte, de sorte que vous ne pouvez pas l'utiliser pour charger une fonction de votre intention d'utiliser dans le code de l'appelant ... méchant ...

same thing

I think this one is the same

this looks promising!!!

I Je ne suis pas sûr (il ne pourrait pas encore le tester) mais il semble que celui-ci dinamycally gère la page à un composant SSDI ...

aucune idée ???

+0

[4guysfromrolla] (http://www.4guysfromrolla.com/) a un très bon [article] (http: // www. 4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2F022504-1.shtml) à ce sujet. –

+0

Vous devriez regarder dans [ExecuteGlobal] (http://msdn.microsoft.com/en-us/library/342311f1 (VS.85) .aspx). Voir l'exemple 3 à [Using ExecuteGlobal pour inclure le code VBScript] (http://www.gwmicro.com/Support/Knowledge_Base/?kbnumber=GWKB2035) – loraderon

+0

Néanmoins, Server.Execute a bien fonctionné pour moi en écrivant un système dynamique de template, parce que les fichiers modèles eux-mêmes ne devaient jamais ajouter de nouvelles fonctions/en soi /. J'ai dû coller un objet dans une session var pour le passer dans le fichier "inclus". Bref ... bref, ta question m'a été utile même si tu n'as jamais eu ce que tu cherchais. :-) –

Répondre

5

Non, vous ne pouvez pas faire une inclusion dyanmic, période.

Votre meilleur coup à c'est un Server.Execute et en passant tout état dans lequel il a besoin via une variable de session: -

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

Vous pouvez faire des inclusions dynamiques. Jetez un oeil à la technique ci-dessous ... – atwrok8

+0

@ atwrok8: Je ne pense pas que vous ayez correctement compris la distinction entre une exécution et une inclusion. – AnthonyWJones

+1

Je comprends parfaitement la distinction entre Server.Execute et la directive #include. Tout simplement parce que le terme "inclure dynamique" est utilisé, cela ne signifie pas qu'il a quelque chose à voir avec la directive #include. En ce qui concerne l'ASP classique, le terme "inclure dynamique" est presque toujours utilisé pour décrire le problème de l'utilisation dynamique d'un morceau de code, basé sur une certaine logique d'exécution. Les liens fournis par opensas pointent tous vers différentes solutions à ce problème, et je suis presque certain que opensas ne demande pas spécifiquement de la directive #include. – atwrok8

0

Je suis un peu rouillé sur ASP classique, mais je suis sûr que vous pouvez utiliser la méthode Server.Execute pour lire dans une autre page ASP, puis continuer à exécuter la page appelante. 15Seconds avait quelques basic stuff à ce sujet - il me prend en arrière ...

+0

Lien mort. C'est pourquoi les informations doivent être incluses dans la réponse au lieu d'être liées à: -/ –

1

Bien sûr, vous pouvez faire REAL classic asp dynamic includes. J'ai écrit cela il y a quelques temps et cela m'a ouvert une nouvelle voie pour Classic ASP. Il fera exactement ce que vous recherchez, même si les gens semblent penser que ce n'est pas possible!

Tous les problèmes juste faites le moi savoir.

+1

@atwork: Cela ne fait pas d'inclusion et pour l'enregistrement juste réitère ce que j'ai déjà déclaré dans ma réponse le plus proche possible c'est un Server.Execute. Il y a une différence importante entre un Execute et un Include. Une exécution utilise un nouveau contexte de script tout le code et les variables sont incluses dans ce contexte pour la page exécutée. Un include insère du code dans le script courant (avant que tout code ne le fasse fonctionner) et ensuite le code entier s'exécute dans le même contexte, partageant des variables et des fonctions. – AnthonyWJones

+0

Je vais y jeter un coup d'œil ... – opensas

+0

@ atwrok8 - Y a-t-il une chance que vous puissiez inclure ce code via un autre lien, ou mettre à jour votre réponse pour l'inclure? Dead link –

0

Je construis un site web où il aurait été pratique de pouvoir utiliser des inclusions dynamiques. Le site est tout ajax (pas de rechargement de page du tout) et bien que les appels JSON retournant les données pures n'en aient pas besoin, tous les différents contenus html pour chaque sous-partie application (fenêtre/volet/zone/formulaire etc) me semble préférable d'être dans des fichiers différents.

Mon idée initiale était de faire en sorte que l'appel ajax soit de nouveau dans le fichier principal du «concentrateur central» (qui supprime l'application en premier lieu), qui sache alors quel sous-fichier inclure. Le simple fait d'inclure tous les fichiers n'était pas réalisable après que j'ai réalisé que chaque appel pour une pièce éventuellement minuscule aurait à analyser tout le code ASP pour l'ensemble du site! Et l'utilisation de la méthode Execute n'était pas bonne, à la fois en termes de rapidité et de maintenance.

J'ai résolu le problème en faisant les pages supposées "enfant" les pages principales, et en incluant le fichier "hub central" dans chacun. Fondamentalement, c'est un javascript aller-retour inclus.

Ceci est moins coûteux qu'il n'y paraît puisque l'idée même d'une page Web est que le serveur répond aux demandes des clients pour "la page suivante" tout le temps. Le contenu demandé est défini dans la portée par la page appelée. Le seul inconvénient à cela est que les "morceaux de web" de l'application doivent vivre partiellement séparés: la plupart de leur contenu dans un vrai nom de fichier .asp, mais assez de leur structure et relation définie dans le principal. fichier ASP (de sorte que, par exemple, un élément de menu dans une pièce Web connaît le nom à utiliser pour appeler ou charger une autre pièce Web et comment ce chargement doit être effectué). En un sens, cependant, c'est toujours un avantage par rapport à un site traditionnel où chaque page doit savoir charger toutes les autres pages. Maintenant, je peux faire des choses comme "charger cette partie (que ce soit une page entière ou autre) de la façon dont veut à charger". Je l'ai également configuré de sorte que chaque partie puisse avoir ses propres javascript et css (si seulement cette partie a besoin de ces choses). Ensuite, ces fichiers sont inclus dynamiquement via javascript seulement la première fois que cette partie est chargée. Ensuite, si la pièce est chargée à plusieurs reprises, elle ne subira pas de frais supplémentaires.

2

Version améliorée (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 vous avez amélioré votre dernière réponse, je vous suggère de modifier le précédent, sans en changer un nouveau –

0

Tout comme une note supplémentaire. Je recevais des caractères ASCII bizarres en haut des pages qui utilisaient des inclusions dynamiques. J'ai donc trouvé que l'utilisation d'un objet ADODB.Stream pour lire le fichier include éliminait ce problème.

donc mon code mis à jour pour la fonction getMappedFileAsString est la suivante

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 
Questions connexes