Эквивалент главных страниц в ASP Classic - PullRequest
4 голосов
/ 14 мая 2010

Можно ли создать некую мастер-страницу с классическим ASP без кадров или iframe с?

Мне интересно, есть ли способ включить контентные страницы на главную страницу, как Главные страницы ASP.NET . Из того, что я исследовал, ASP Classic поддерживает включение других страниц ASP / HTML на страницу, но значение, указанное в этом include, означает, что функция не может быть динамической.

Ответы [ 5 ]

12 голосов
/ 15 мая 2010

Вы можете просто создать функции (скажем, функцию Header() и функцию Footer()), которые ничего не делают, кроме вывода некоторого набора разметки. Эти функции также могут принимать параметры и вызываться условно. Это не совсем то же самое, что мастер-страница, но звучит так, будто она выполняет то, что вы пытаетесь сделать. У вас будет <!--#include file="headerfooter.asp"--> на каждой странице, и каждая страница будет вызывать Header() & Footer().

Или вы можете просто использовать <!--#include file="header.asp"--> вверху и <!--#include file="footer.asp"--> внизу каждой страницы. Я видел оба подхода.

Если вы ищете обратную сторону, то есть одну шаблонную страницу, которая называет отдельные страницы в своем «среднем» разделе, то это не то, что вы легко можете сделать с помощью ASP classic. Это принципиальное различие в подходе: в ASP.NET есть концепция дерева элементов управления, событий и т. Д., В то время как ASP Classic - это, по сути, просто скрипт, который выполняется сверху вниз.

7 голосов
/ 21 августа 2013

Эта идея взята из Классические ASP Master Pages | Код безбожника . Я расшифровал код в изображениях на этой странице, немного расширил его пример, а также изучил ограничения этой техники.

Идея состоит в том, что на каждой странице есть только одно включение на стороне сервера (один вызов <!--#include file="" -->). Единственное включение - это основной файл шаблона, который вы можете назвать master.asp. Главная страница вызывает пользовательские подпрограммы на каждой странице вместо каждой области содержимого. Каждая дочерняя страница определяет эти подпрограммы с Sub, с содержимым, уникальным для этой дочерней страницы.

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 %>

Это превращается в этот HTML, когда вы посещаете aboutUs.asp на сервере IIS:

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

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

    </body>
</html>

Однако этот подход не позволяет вкладывать:

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 %>

Это не будет работать, потому что вложенные Sub s являются синтаксической ошибкой:

Ошибка компиляции Microsoft VBScript '800a03ea'

Синтаксическая ошибка

/ template_user.asp, строка 9

Sub LogoSide
^

Поскольку вложение не разрешено, эта система шаблонов, по сути, является одноразовым решением. Если подпрограммы ваших отдельных страниц становятся слишком громоздкими, вы больше не сможете использовать эту технику. Поэтому при использовании этой техники вам следует тщательно выбирать, где вырезать набор шаблонов, чтобы обеспечить наилучший баланс между гибкостью и DRY ness.

3 голосов
/ 04 мая 2012

Одна из самых уродливых проблем в классическом ASP состоит в том, что #includes всегда происходит, поэтому помещение двух включений в конструкцию if - then - else всегда включает оба - даже если вы видите только вывод, который применяется к вашему условному значению.

Даже если они включают работу, они не дают того результата, который вам действительно нужен, а именно: выбрать шаблон или обложку «на лету».

Одним из способов справиться с этой ситуацией является использование механизма шаблонов, такого как KudzuASP, который превосходит традиционную методологию #include. Вот очень простой пример:

<!-- 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>

И код ASP выглядит следующим образом:

<%@ 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
%>

Механизм шаблонов выполняет вызовы ваших пользовательских объектов, определенных в кодовой странице ASP хоста, когда обрабатываются соответствующие теги. Члены функции ваших пользовательских классов имеют прямой доступ к странице хостинга и ее переменным и методам, а также к иерархии объектов механизма шаблонов. Другими словами, шаблон управляет выводом и хост-страницей ASP во время вывода.

Это превосходит механизм включения, поскольку механизм шаблонов может динамически выбирать, какой шаблон HTML обрабатывать во время выполнения, и он может динамически включать библиотеки пользовательских обработчиков тегов, используя встроенный тег <!--[import/]-->.

ОБНОВЛЕНИЕ 2016.01.13: Я открыл исходный код этого проекта, и вы можете найти последний код, поддерживаемый по этому адресу: https://github.com/Mumpitz/KudzuASP

1 голос
/ 03 сентября 2015

Рори написал отличный пример для мастер-страниц в Classic ASP, но продемонстрировал, что подход «мастер-страницы» имеет свои ограничения, поскольку подпрограммы не могут быть вложенными.

Однако, ради демонстрации, и поскольку JavaScript в Classic ASP практически не имеет документации в Интернете, вот тот же пример, который не работает в ASP VBScript, но не будет не работать в ASP JavaScript.

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" />
    <% } %>
<% } %>

Это работает! Вот сочные результаты:

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

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

    </body>
</html>

Помните, что JavaScript, даже версия ECMAScript 3 для Classic ASP, часто намного мощнее и выразительнее, чем механизм VBScript, который был одобрен и активно продвигался Microsoft. Если вам когда-либо приходилось использовать Classic ASP, используйте JavaScript!

0 голосов
/ 31 октября 2014

Я просто использую страницу Default.asp с html, затем помещаю свой код в область содержимого.

<%@ Language="VBScript" %>
    <!DOCTYPE html>
    <html lang="en">
        <head>
             <meta charset="utf-8" />
        </head>
        <body>
            <div id="topNav"> <!--begin top Nav-->
                <ul> 
                    <!--Be sure that all links are like this href="?page=contentPageEx"-->
                    <li><a href="?page=home">Home</a></li> 
                </ul>   
            </div> <!--end top Nav-->

            <div id="content">
                   <%
                        Dim default
                        default= Request.QueryString 
                        If default= "" Then 
                        Server.execute "includes/home.html"
                        Else 
                        Server.execute "includes/" & request("page")  & ".html"
                        end if 
                    %>   
            </div>  


            <div id="botNav"> <!--begin bot Nav-->
                <ul> 
                  <li><a href="?page=home">Home</a></li>   
                </ul>
            </div> <!--end Bot Nav-->

         </body>
</html> 

Затем я помещаю все свое содержимое во включаемый файл с 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> 
...