6

是否可以使用没有框架或s 的Classic ASP 构建某种母版页iframe

我想知道是否有一种方法可以像ASP.NET 母版页那样在主页中包含内容页面。根据我的研究,ASP Classic 确实支持将其他 ASP/HTML 页面包含到一个页面中,但是放入这个值include意味着该函数不能是动态的。

4

5 回答 5

12

您可以只创建函数(例如,一个Header()函数和一个Footer()函数),这些函数除了输出一组标记之外什么都不做。这些函数也可以接受参数,并有条件地调用。它与母版页不太一样,但听起来它完成了您想要做的事情。您将<!--#include file="headerfooter.asp"-->在每个页面上都有一个,并且每个页面都会调用Header()& Footer()

或者您也可以在每页<!--#include file="header.asp"-->的顶部和底部使用。<!--#include file="footer.asp"-->我见过这两种方法。

如果您正在寻找相反的情况,即在它的“中间”部分调用单个页面的单个模板页面,那么这并不是您可以使用 ASP 经典轻松完成的事情。这是方法的根本区别:ASP.NET 有一个控制树、事件等的概念,而 ASP Classic 本质上只是一个从上到下运行的脚本。

于 2010-05-14T21:18:23.847 回答
8

这个想法来自Classic 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 %>

aboutUs.asp当您在 IIS 服务器上访问时,它会变成这个 HTML :

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

这不起作用,因为嵌套Subs 是语法错误:

Microsoft VBScript 编译错误“800a03ea”

语法错误

/template_user.asp,第 9 行

Sub LogoSide
^

由于不允许嵌套,因此该模板系统实际上是一次性解决方案。如果您的各个页面的子程序变得过于笨拙,您就不能再使用这种技术了。因此,在使用此技术时,您应该仔细选择在哪里划分您的模板集,以便在灵活性和DRY性之间提供最佳平衡。

于 2013-08-20T22:24:03.123 回答
4

Rory 为 Classic ASP 中的母版页编写了一个很好的示例,但证明了“母版页”方法有其局限性,因为 Subs 不能嵌套。

但是,为了演示,并且因为 Classic ASP 中的 JavaScript 在 Internet 上几乎没有任何文档,所以这里有一个在 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,甚至是 Classic ASP 中的 ECMAScript 3 版本,通常都比微软青睐和大力推广的 VBScript 引擎更强大、更具表现力。如果您必须使用 Classic ASP,请使用 JavaScript!

于 2015-09-02T23:30:30.807 回答
3

经典 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

于 2012-05-04T04:53:49.580 回答
0

我只是使用带有 html 的 Default.asp 页面,然后将我的代码放在内容区域中。

<%@ 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> 
于 2014-10-31T01:16:05.817 回答