2010-05-14 7 views
3

Est-il possible de créer un type de page maître avec Classic ASP sans ou iframe s?Équivalent aux pages maîtres dans ASP Classic

Je me demande s'il existe un moyen d'inclure des pages de contenu dans la page principale comme ASP.NET master pages. D'après ce que j'ai recherché, ASP Classic prend en charge l'inclusion d'autres pages ASP/HTML dans une page, mais la valeur mise dans ce include signifie que la fonction ne peut pas être dynamique.

+0

Ce n'est pas tout à fait clair mais est-ce conditionnel que vous êtes après? Parce que ce n'est pas vraiment possible '<% Si vrai Alors%><%Else%><%End If%>' – Filburt

+0

Sensationnel. Je suis venu ici pour savoir où se trouvait le code magique sur la page ASP classique sur laquelle je travaille et qui comprend un en-tête. Je n'ai pas réalisé que les '" comments "étaient en fait des directives./Facepalm. Microsoft remporte une fois de plus le prix du "concept de code le plus bête" ... –

Répondre

12

Vous pouvez simplement créer des fonctions (par exemple, une fonction Header() et une fonction Footer()) qui ne font que produire un ensemble de balisage. Ces fonctions peuvent également prendre des paramètres et être appelées conditionnellement. Ce n'est pas tout à fait la même chose qu'une page maître, mais il semble que cela accomplisse ce que vous essayez de faire. Vous auriez un <!--#include file="headerfooter.asp"--> sur chaque page, et chaque page appellerait Header() & Footer().

Ou vous pouvez simplement utiliser <!--#include file="header.asp"--> en haut et <!--#include file="footer.asp"--> en bas de chaque page aussi. J'ai vu les deux approches.

Si vous recherchez l'inverse, c'est-à-dire une seule page de modèle qui appelle des pages individuelles dans sa section "milieu", alors ce n'est pas vraiment quelque chose que vous pouvez faire facilement avec ASP classic. C'est une différence fondamentale dans l'approche: ASP.NET a un concept d'arbre de contrôle, d'événements, etc., alors qu'ASP Classic est essentiellement un script qui fonctionne de haut en bas.

3

L'un des plus laids problèmes dans ASP classique est que #includes toujours le cas, mettant ainsi deux inclut dans un if-then - construction else comprend toujours à la fois - même si vous ne voyez que la sortie qui correspond à votre valeur conditionnelle.

Même lorsque le travail est inclus, il ne vous donne pas le résultat que vous recherchez vraiment, à savoir sélectionner un modèle ou une enveloppe «à la volée». Une façon de gérer cette situation est d'utiliser un moteur de template tel que KudzuASP qui surpasse la méthodologie traditionnelle #include. Voici un exemple très simple:

<!-- An HTML Template --> 
<html> 
<head><title><!--[Replace|PageTitle]-->PageTitle<!--[/Replace]--></title></head> 
<body> 
<table border="1" cellpadding="4" callspacing="2" width="640"> 
<tr> 
    <td colspan="2"><!--[HeaderContent/]--></td> 
</tr> 
<tr> 
    <td width="160"><!--[LeftColumnContent/]--></td> 
    <td><!--[MainContent/]--></td> 
</tr> 
<tr> 
    <td colspan="2"><!--[FooterContent/]--></td> 
</tr> 
</table> 
</body> 
</html> 

Et le code ASP ressemble à ceci:

<%@ Language=VBScript %> 
<!-- #include file="./KudzuASP/_kudzu.asp" --> 
<% 
Dim PageTitle : PageTitle = "This is a Master Page" 

' 
' Create the template engine 
' 
Dim T_ENGINE 
Set T_ENGINE = New CTemplateEngine 

T_ENGINE.PutValue "PageTemplate", PageTemplate 
T_ENGINE.SetHandler "HeaderContent", New CTXHeaderContent 
T_ENGINE.SetHandler "LeftColumnContent", New CTXLeftColumnContent 
T_ENGINE.SetHandler "MainContent", New CTXMainContent 
T_ENGINE.SetHandler "FooterContent", New CTXFooterContent 

' 
' Custom Tage Handlers 
' 
Class CTXHeaderContent 
    Public Sub HandleTag(vNode) 
     vNode.Engine.ContentAppend "Header" 
    End Sub 
End Class 

Class CTXLeftColumnContent 
    Public Sub HandleTag(vNode) 
     vNode.Engine.ContentAppend "Left<br/>Content" 
    End Sub 
End Class 

Class CTXMainContent 
    Public Sub HandleTag(vNode) 
     vNode.Engine.ContentAppend "Main<br/>Content" 
    End Sub 
End Class 

Class CTXFooterContent 
    Public Sub HandleTag(vNode) 
     vNode.Engine.ContentAppend "Footer" 
    End Sub 
End Class 

' 
' Evaluate the template 
' 
T_ENGINE.ParseFile Server.MapPath("./MasterPage.html") 
T_ENGINE.EvalTemplate 
%> 

Le moteur de modèle fait appel à vos objets personnalisés définis dans l'hébergement page de code ASP lorsque les balises appropriées sont traité. Les membres de la fonction de vos classes personnalisées ont un accès direct à la page d'hébergement et à ses variables et méthodes, ainsi qu'à la hiérarchie des objets du moteur de modèles. En d'autres termes, le modèle pilote la sortie et la page ASP d'hébergement pendant la sortie. Cela bat le mécanisme d'inclusion, car le moteur de gabarit peut sélectionner dynamiquement le modèle HTML à traiter lors de l'exécution et il peut inclure dynamiquement des bibliothèques de gestionnaires de balises personnalisées à l'aide de la balise <!--[import/]--> intégrée.

MISE À JOUR 13/01/2016: J'ai ouvert le code source de ce projet et vous pouvez trouver le dernier code maintenu à cette adresse: https://github.com/Mumpitz/KudzuASP

+0

Malheureusement, le [site de l'auteur de KudzuASP] (http://www.andrewfriedl.com/downloads/), où vous pouvez télécharger KudzuASP, semble être ] (http://isup.me/www.andrewfriedl.com/downloads/) maintenant, tout comme le [ancien site de téléchargement] (http://kudzu.trilogicllc.com/webray/QuikPage.asp?topic=Downloads) . Mais j'ai été capable de trouver une [ancienne version de la bibliothèque et des pages d'exemples] (http://code.google.com/p/allsoft/source/browse/trunk/trunk/Web_Resources/KudzuASP), et un [ancien article ] (http://www.codeproject.com/Articles/22348/KudzuASP-Introduction-to-Templating-with-KudzuASP) à propos de KudzuASP. –

6

Cette idée est de Classic ASP Master Pages | Godless Code. J'ai transcrit le code en images sur cette page, j'ai un peu prolongé son exemple et j'ai aussi exploré les limites de cette technique.

L'idée est que chaque page n'a qu'une seule inclusion côté serveur (un appel <!--#include file="" -->). L'inclusion unique est un fichier modèle principal, que vous pouvez nommer master.asp. La page maître appelle des sous-programmes personnalisés sur chaque page à la place de chaque zone de contenu. Chaque page enfant définit ces sous-programmes avec Sub, avec un contenu propre à cette page enfant.

master.asp
<!DOCTYPE html> 
<html> 
    <head> 
     <title><% Title() %></title> 
    </head> 
    <body> 
     <% BodyContent() %> 
    </body> 
</html> 
aboutUs.asp
<!--#include file="master.asp" --> 

<% Sub Title %> About Us <% End Sub %> 

<% Sub BodyContent %> 
    <h1>About Us</h1> 
    <p> 
     We do things! 
    </p> 
<% End Sub %> 

qui se transforme en ce HTML lorsque vous visitez aboutUs.asp sur un serveur IIS:

<!DOCTYPE html> 
<html> 
    <head> 
     <title> About Us </title> 
    </head> 
    <body> 

    <h1>About Us</h1> 
    <p> 
     We do things! 
    </p> 

    </body> 
</html> 

Cependant, cette approche ne permet pas d'imbrication:

subtemplate.asp
<div class="innerLogo <% LogoSide() %>"> 
    <% LogoImg() %> 
</div> 
template_user.asp
<!--#include file="master.asp" --> 

<% Sub Title %> Our Logo <% End Sub %> 

<% Sub BodyContent %> 

    <!--#include file="subtemplate.asp" --> 

    <% Sub LogoSide %> leftside <% End Sub %> 

    <% Sub LogoImg %> 
     <img src="img/about.png" alt="About" /> 
    <% End Sub %> 

<% End Sub %> 

Cela ne fonctionnera pas, car imbriqués Sub s sont une erreur de syntaxe:

Microsoft VBScript compilation error '800a03ea'

Syntax error

/template_user.asp, line 9

Sub LogoSide 
^ 

Depuis l'imbrication n'est pas autorisé, ce système de templating est, en effet, un solution unique. Si les sous-routines de vos pages individuelles deviennent trop lourdes, vous ne pouvez plus utiliser cette technique. Donc, lorsque vous utilisez cette technique, vous devez choisir avec soin l'emplacement de votre ensemble de modèles afin de fournir le meilleur équilibre entre flexibilité et DRY.

+1

"Cela ne fonctionnera pas, car les sous-systèmes imbriqués sont une erreur de syntaxe" - Cela n'est vrai que lorsque vous utilisez VBScript. Vous pouvez remplacer les sous-marins par des fonctions JavaScript (avec une déclaration de langue en haut de la page enfant), et imbriquer tout ce que vous voulez. Les gens oublient souvent que JavaScript est la meilleure solution de langage dans ASP classique (probablement parce que c'est documenté nulle part). –

0

Je viens d'utiliser une page Default.asp avec html, puis mettre mon code dans la zone de contenu. Ensuite, j'ai mis tout mon contenu dans un fichier inclus avec des pages HTML.

<!DOCTYPE html> 

    <html lang="en"> 
     <head> 
      <meta charset="utf-8" /> 

      <!--Search engines use this title ect...--> 
      <title>Hello SEO! This is a content page!</title> 
      <!--Can be styled independently--> 
      <style> 
       p { 
        color: #0094ff; 
       } 
      </style> 
     </head> 
     <body> 
     <p>Hello World!</p> 
     </body> 
    </html> 
1

Rory a écrit un excellent exemple pour les pages de maître en ASP classique, mais démontré que l'approche « page maître » a ses limites parce que Subs ne peut pas être imbriquées. Cependant, pour des raisons de démonstration, et parce que JavaScript dans ASP Classic n'a quasiment aucune documentation sur Internet, voici le même exemple qui échoue dans ASP VBScript mais ne va pas échouer dans JavaScript ASP.

master.asp
<!DOCTYPE html> 
<html> 
    <head> 
     <title><% Title() %></title> 
    </head> 
    <body> 
     <% BodyContent() %> 
    </body> 
</html> 
subtemplate.asp
<div class="innerLogo <% LogoSide() %>"> 
    <% LogoImg() %> 
</div> 
template_user.asp
<%@ Language= "Javascript" %> 
<!--#include file="master.asp" --> 

<% function Title() { %> About Us <% } %> 

<% function BodyContent() { %> 

    <!--#include file="subtemplate.asp" --> 

    <% function LogoSide() { %> leftside <% } %> 

    <% function LogoImg() { %> 
     <img src="img/about.png" alt="About" /> 
    <% } %> 
<% } %> 

Il fonctionne!voici les résultats juteux:

<!DOCTYPE html> 
<html> 
    <head> 
     <title> About Us </title> 
    </head> 
    <body> 

    <div class="innerLogo leftside "> 
     <img src="img/about.png" alt="About" /> 
    </div> 

    </body> 
</html> 

Rappelez-vous, JavaScript, même la version ECMAScript 3 en ASP classique, est souvent beaucoup plus puissant et expressif que le moteur VBScript qui a été favorisé et fortement promu par Microsoft. Si jamais vous devez utiliser Classic ASP, utilisez JavaScript!