如果您坚持使用 ASP Classic,您可能会找到一些方法来处理类似功能的母版页,但据我所知,框架并不支持这种方法。
[编辑] 鉴于对原始问题的编辑,首先演示的方法并不那么有趣,因此我也建议另一种方法。
您可以制作一个通用的 ASP 页面,为网站的所有流量提供服务。然后一个查询参数指定应该显示哪个子页面。子页面被制成单独的 ASP 页面,由通用/母版页或另一个子页面执行。一个非常粗略的例子可能如下所示:
<%
url = Request.QueryString("url") & ""
if url = "/" or url = "" then
subpage = "home.asp"
else
subpage = url & ".asp"
end if
%>
<!DOCTYPE html>
<html>
<head>
<title>Header for all pages</title>
<link rel="stylesheet" href="/css/site.css" />
</head>
<body>
<% Server.Execute(subpage) %>
</body>
</html>
然后应该以这种方式处理该站点:
www.domain.com/default.asp?url=/contact
这会将contact.asp子页面加载到母版页中,或者:
www.domain.com/default.asp?url=/user/1234/profile
加载用户的个人资料页面(由文件夹 user/1234 中的 profile.asp 显示)。最后一个示例引发了一些问题,因为每个用户都必须拥有一个包含所有 asp 文件的文件夹(这远非最佳),因此您可能希望对 url 查询参数进行一些解释,以更智能的方式重定向输入。
另一个问题是子页面本身就是 ASP 页面,这意味着有人可以直接引用它们。这需要采取一些措施来保护这些子页面不被直接引用。可以做到,但这可能意味着包含一些代码 => 回到原点!
这种方法的另一个缺点是子页面在它们自己的上下文中呈现,因此无法从调用页面的上下文中访问功能和数据。这意味着必须以其他方式(会话、应用程序、数据库或其他方式)共享全局数据。数据也不能传递到子页面(不,Server.Execute 不允许查询参数)。
包含方式
就我个人而言,我认为您可以通过使用页眉/页脚包含来获得最大的灵活性,如我的原始帖子中所示,如下所示。
一种方法是将您的一般内容放入包含中,然后在每个 ASP 页面上包含这些位。例如:
<!-- #include virtual="/includes/header.asp" -->
content goes here
<!-- #include virtual="/includes/footer.asp" -->
你的 header.asp 可能看起来像这样:
<!DOCTYPE html>
<html>
<head>
<title>Header for all pages</title>
<link rel="stylesheet" href="/css/site.css" />
</head>
<body>
和 footer.asp 像这样:
</body>
</html>
这种策略有一些缺点。标题是相当静态的,可能会给 SEO 带来一些问题;一方面,标题应该适合页面内容,这在包含包含标题标记时很难完成。这可以通过在包含部分之前设置的一些全局变量来促进,即:
<%
title = "Title for this page's content"
%>
<!-- #include virtual="/includes/header.asp" -->
content goes here
<!-- #include virtual="/includes/footer.asp" -->
然后像这样在标题中
<!DOCTYPE html>
<html>
<head>
<title><%=title%></title>
<link rel="stylesheet" href="/css/site.css" />
</head>
<body>
但这已经开始有点“味道”了,因为您为包含文件中的包含页面设置了一些期望。至少在构建页面时您必须非常自律。