Эквивалентен мастер-страницам в ASP Classic

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

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


person Poku    schedule 14.05.2010    source источник
comment
Это не совсем понятно, но условно ли это включает в себя то, что вам нужно? Потому что на самом деле это невозможно <%If true Then%> <!--#include file="A.asp"--> <%Else%> <!--#include file="B.asp"--> <%End If%>   -  person Filburt    schedule 15.05.2010
comment
Ух ты. Я пришел сюда, чтобы узнать, где находится волшебный код на классической странице ASP, над которой я работаю, которая включает заголовок. Я не понимал, что комментарии <!--#include header.asp--> на самом деле были директивами. / facepalm. Microsoft снова получает приз за самую глупую концепцию кода ...   -  person Kristen Hammack    schedule 21.09.2016
comment
Директива include - это синтаксис включения на стороне сервера. Microsoft не изобрела это, они просто поддерживают это.   -  person Gary    schedule 21.01.2021


Ответы (5)


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

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

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

person Matthew Groves    schedule 14.05.2010

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

Идея состоит в том, что каждая страница имеет только одно включение на стороне сервера (один вызов <!--#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 являются синтаксической ошибкой:

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

Ошибка синтаксиса

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

Sub LogoSide
^

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

person Rory O'Kane    schedule 20.08.2013
comment
Это не сработает, потому что вложенные подпрограммы являются синтаксической ошибкой - это верно только при использовании VBScript. Вы можете заменить подпрограммы функциями JavaScript (вместе с объявлением языка вверху дочерней страницы) и вложить все, что захотите. Люди часто забывают, что JavaScript - лучшее языковое решение в классическом ASP (вероятно, потому, что он нигде не документирован). - person Matthew Dean; 03.09.2015

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

Однако для демонстрации и поскольку JavaScript в классическом 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 в классическом ASP, часто бывает более мощным и выразительным, чем движок VBScript, который поддерживал и активно продвигал Microsoft. Если вам когда-нибудь придется использовать классический ASP, используйте JavaScript!

person Matthew Dean    schedule 02.09.2015

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

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

Один из способов справиться с этой ситуацией - использовать механизм шаблонов, такой как 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

person Andrew Friedl    schedule 04.05.2012
comment
К сожалению, сайт автора KudzuASP, на котором вы можете скачать KudzuASP, кажется сейчас недоступен, как и старый сайт загрузок. Но мне удалось найти старую версию библиотеки. и примеры страниц, а также старую статью о KudzuASP. - person Rory O'Kane; 20.08.2013

Я просто использую страницу 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> 
person Tim    schedule 31.10.2014