フレームやsを使用せずにClassicASPを使用してある種のマスターページを作成することは可能ですか?iframe
ASP.NETマスターページのようにメインページにコンテンツページを含める方法があるかどうか疑問に思っています。私が調査したところ、ASPClassicは他のASP/ HTMLページをページに含めることをサポートしていますが、これに値を入れるincludeと、関数を動的にすることはできません。
フレームやsを使用せずにClassicASPを使用してある種のマスターページを作成することは可能ですか?iframe
ASP.NETマスターページのようにメインページにコンテンツページを含める方法があるかどうか疑問に思っています。私が調査したところ、ASPClassicは他のASP/ HTMLページをページに含めることをサポートしていますが、これに値を入れるincludeと、関数を動的にすることはできません。
マークアップのセットを出力するだけの関数(たとえば、Header()関数と関数)を作成するだけで済みます。Footer()これらの関数もパラメーターを取り、条件付きで呼び出すことができます。マスターページとはまったく同じではありませんが、あなたがやろうとしていることを達成しているように聞こえます。各ページにが<!--#include file="headerfooter.asp"-->あり、各ページはHeader()&を呼び出しますFooter()。
または、各ページの<!--#include file="header.asp"-->上部と下部で使用することもできます。<!--#include file="footer.asp"-->私は両方のアプローチを見てきました。
逆、つまり「中央」セクションの個々のページを呼び出す単一のテンプレートページを探している場合、それはASPクラシックで簡単に実行できることではありません。これはアプローチの根本的な違いです。ASP.NETにはコントロールツリーやイベントなどの概念がありますが、ASPClassicは基本的に上から下に実行される単なるスクリプトです。
このアイデアは、クラシックASPマスターページからのものです。神のいないコード。そのページの画像のコードを書き起こし、その例を少し拡張し、この手法の制限についても調べました。
各ページにはサーバーサイドインクルードが1つ(1回の<!--#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.aspIISサーバーにアクセスすると、次の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ネストされたsは構文エラーであるため、これは機能しません。
MicrosoftVBScriptコンパイルエラー「800a03ea」
構文エラー
/template_user.asp、9行目
Sub LogoSide ^
ネスティングは許可されていないため、このテンプレートシステムは事実上1回限りのソリューションです。個々のページのサブルーチンが扱いにくくなった場合、この手法を再度使用することはできません。したがって、この手法を使用する場合は、柔軟性と乾燥性のバランスを最適化するために、テンプレートのセットを作成する場所を慎重に選択する必要があります。
Roryは、Classic ASPのマスターページの優れた例を作成しましたが、Subsをネストできないため、「マスターページ」アプローチには制限があることを示しました。
ただし、デモンストレーションのために、またクラシックASPのJavaScriptにはインターネット上のどこにもドキュメントがほとんどないため、ASP VBScriptでは失敗するが、ASPJavaScriptでは失敗しない同じ例を次に示します。
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は、ClassicASPのECMAScript3バージョンでさえ、Microsoftによって支持され、大いに宣伝されたVBScriptエンジンよりもはるかに強力で表現力豊かであることがよくあります。Classic ASPを使用する必要がある場合は、JavaScriptを使用してください。
従来のASPで最も醜い問題の1つは#includes常に発生することです。したがって、条件値に適用される出力しか表示されない場合でも、---構成に2つのインクルードを含めると常に両方が含まれifますthen。else
作業が含まれている場合でも、「オンザフライ」でテンプレートまたはスキンを選択するという、本当に探している結果は得られません。
この状況に対処する1つの方法は、従来の方法論を超える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/]-->です。
UPDATE 2016.01.13:私はこのプロジェクトをオープンソース化しました。このアドレスで維持されている最新のコードを見つけることができます:https ://github.com/Mumpitz/KudzuASP
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>