是否可以使用经典ASP 不使用框架或iframe
来构建某种母版页?
我想知道是否有办法在主页中包含内容页面,如ASP.NET master pages。根据我的研究,ASP Classic确实支持将其他ASP / HTML页面包含到页面中,但是放入此include
的值意味着该函数不能是动态的。
答案 0 :(得分:12)
您可以创建函数(例如,Header()
函数和Footer()
函数),它们除了输出一些标记之外什么都不做。这些函数也可以采用参数,并有条件地调用。它与Master页面不完全相同,但听起来它完成了你想要做的事情。每页都会有一个<!--#include file="headerfooter.asp"-->
,每个页面都会调用Header()
&amp; Footer()
。
或者您也可以使用顶部的<!--#include file="header.asp"-->
和每页底部的<!--#include file="footer.asp"-->
。我见过这两种方法。
如果您正在寻找相反的方法,即单个模板页面在其“中间”部分调用单个页面,那么这不是您可以使用ASP classic轻松完成的事情。这是方法的根本区别:ASP.NET有一个控制树,事件等概念,而ASP Classic本质上只是一个从上到下运行的脚本。
答案 1 :(得分:7)
这个想法来自Classic ASP Master Pages | Godless Code。我在该页面的图像中转录了代码,稍微扩展了它的例子,并探讨了这种技术的局限性。
这个想法是每个页面只有一个服务器端包含(一个<!--#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 %>
当您在IIS服务器上访问aboutUs.asp
时,会变成此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 %>
这不起作用,因为嵌套的Sub
是语法错误:
Microsoft VBScript编译错误'800a03ea'
语法错误
/template_user.asp,第9行
Sub LogoSide ^
由于不允许嵌套,因此该模板系统实际上是一次性解决方案。如果您的单个页面的子程序变得太笨重,则无法再次使用此技术。因此,在使用此技术时,您应该仔细选择在哪里开发模板集,以便在灵活性和DRY之间实现最佳平衡。
答案 2 :(得分: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
答案 3 :(得分:1)
Rory为Classic ASP中的母版页写了一个很好的例子,但证明了“母版页”方法有其局限性,因为Subs不能嵌套。
但是,为了演示,并且因为经典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,甚至是经典ASP中的ECMAScript 3版本,通常比微软青睐并大力推广的VBScript引擎更强大,更具表现力。如果您必须使用经典ASP,请使用JavaScript!
答案 4 :(得分: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>