经典 ASP 框架 - 让你的经典 ASP 代码像 ASP.NET 一样工作






4.80/5 (35投票s)
2004 年 2 月 2 日
3分钟阅读

431957

4403
使用与 ASP.NET 相同的技术在经典 ASP 中进行开发? 如果你必须在经典 ASP 中工作,为什么不以正确的方式去做呢? 通过使用类似的框架,不仅你的代码会更有组织和效率,而且迁移到 ASP.NET 所需的时间也会大大缩短!
引言
使用经典 ASP 框架,你将能够以与 ASP.NET 几乎相同的方式构建你的 ASP 页面。 该框架的优点在于它包含了 ASP.NET 中找到的大部分控件,例如 TextBox、Label、GenericHTML、DropDown、CheckBox、CheckBoxList、RadioButtonList、DataRepeater、DataList、DataTable 以及更多! 该框架是事件驱动的,并支持 ViewState!
背景
所以,你可能会问,我为什么要花时间做这件事,尤其是在 ASP.NET 如此出色并且可以满足你的一切需求的情况下。 好吧,主要原因是我作为一名顾问工作,并且仍然有很多需要维护和支持的 ASP 网站。 在我学习了 .NET 之后,我爱上了它,并且我不想再以任何其他方式编写代码。 所以我决定提取它最重要的部分,并在经典 ASP 上创建一个类似的框架。主要优点是
- 编码所需的时间更少,更具可读性且更易于维护。
- 事件驱动模型。
- 简化了到 ASP.NET 的迁移。
屏幕截图
使用代码
使用代码非常简单。 只需包含 "WebControl.asp" 文件,以及要添加到 ASP 页面的每个服务器控件的引用(每个控件都包装在自己的 ASP 文件中)。 在包含引用后,你需要编写代码在你要处理的每个事件中。
表单由框架处理。 只需在表单开始时包含 FormStart.asp,在需要关闭表单标签时包含 FormEnd.asp。 这两个包含文件将确保包含所有必要的隐藏字段。 最后要做的是 Main() 方法(包含在 WebControls.asp 中)。 此方法将发挥魔力。 我称它为“页面控制器”,因为它以适当的顺序协调所有事件的执行。 只有在声明所有包含文件之后以及在渲染任何控件之前才应调用此方法。
该框架包含几个示例,显示了它的工作原理。
WebControl.asp 包含核心类:WebControl 和 Page。 所有控件都“继承”自 WebControl(包括 Page 类)。 现在,等一下,VbScript 中的继承? 实际上,我通过在每个服务器控件中包含每个 WebControl 变量来“模拟”继承。
除此之外,你还需要注册一个 COM 组件 (ASPFramework.dll),该组件用于封装 ViewState(它是 XML)、Base64 函数和 ListItemCollection。 这是一个 VB 类,并提供源代码。 使用 VB 类的唯一原因是出于速度目的。 我们不想在 VBScript 中加密/解密!
**可以重载的支持事件列表(它们不需要定义!)
Page_Authenticate_Request
Page_Authorize_Request
Page_Init
Page_Controls_Init
'仅在页面首次加载时发生!Page_LoadViewState
Page_Load
Page.HandleClientEvent
Page_PreRender
Page_SaveViewState
对于服务器控件
OnInit
OnLoad
<!--#Include File = "..\WebControl.asp" -->
<!--#Include File = "..\Server_LinkButton.asp" -->
<!--#Include File = "..\Server_CheckBox.asp" -->
<!--#Include File = "..\Server_DropDown.asp" -->
<!--#Include File = "..\Server_Label.asp" -->
<!--#Include File = "DBWrapper.asp" -->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>DropDown Example</TITLE>
<LINK rel="stylesheet" type="text/css" href="Samples.css">
</HEAD>
<BODY>
<!--#Include File = "Home.asp" -->
<%
Call Main()
%>
<Span Class="Caption">DROPDOWN EXAMPLES</Span>
<!--#Include File = "..\FormStart.asp" -->
<%lblMessage%><HR>
<%chkHideShow%> | <%chkAutoPostBack%> | <%chkListBox%><HR>
<%cboDropDown%>
<HR>
<%cmdAdd%> | <%cmdRemove%>
<!--#Include File = "..\FormEnd.asp" -->
</BODY>
</HTML>
<% 'This would normaly go in a another page, but for the sake
'of simplicity and to minimize the number of pages
'I'm including code behind stuff here...
Dim lblMessage
Dim cmdAdd
Dim cmdRemove
Dim chkHideShow
Dim chkAutoPostBack
Dim chkListBox
Dim cboDropDown
Page.DebugEnabled = False
Public Function Page_Init()
Set lblMessage = New_ServerLabel("lblMessage")
Set cmdAdd = New_ServerLinkButton("cmdAdd")
Set cmdRemove = New_ServerLinkButton("cmdRemove")
Set chkHideShow = New_ServerCheckBox("chkHideShow")
Set chkAutoPostBack = New_ServerCheckBox("chkAutoPostBack")
Set chkListBox= New_ServerCheckBox("chkListBox")
Set cboDropDown = New_ServerDropDown("cboDropDown")
End Function
Public Function Page_Controls_Init()
cmdAdd.Text = "Add"
cmdRemove.Text = "Remove"
lblMessage.Control.Style = "border:1px solid blue;
background-color:#EEEEEE;width:100%;font-size:8pt"
lblMessage.Text = "This is an Example"
chkHideShow.Caption = "Hide/Show List"
chkHideShow.AutoPostBack = True
chkAutoPostBack.Caption = "DropDown AutoPostBack"
chkAutoPostBack.AutoPostBack=True
chkListBox.Caption = "Make it a list box"
chkListBox.AutoPostBack = True
cboDropDown.DataTextField = "TerritoryDescription"
cboDropDown.DataValueField = "TerritoryID"
Set cboDropDown.DataSource = GetRecordset(
"SELECT TerritoryID,TerritoryDescription FROM
Territories ORDER BY 2")
cboDropDown.DataBind() 'Loads the items collection
'(that will stay in the viewstate)...
Set cboDropDown.DataSource = Nothing 'Clear
cboDropDown.Caption = "Territory:"
cboDropDown.CaptionCssClass = "InputCaption"
End Function
Public Function Page_PreRender()
Dim x,mx
Dim msg
Set msg = New StringBuilder
msg.Append "<B>Selected Value=</B>" &
cboDropDown.Items.GetSelectedText & "<BR>"
msg.Append "<B>Selected Text=</B>" &
cboDropDown.Items.GetSelectedValue & "<BR>"
msg.Append "<HR>"
mx = cboDropDown.Items.Count -1
lblMessage.Text = msg.ToString()
End Function
Public Function chkHideShow_Click()
cboDropDown.Control.Visible = Not cboDropDown.Control.Visible
End Function
Public Function chkAutoPostBack_Click()
cboDropDown.AutoPostBack = chkAutoPostBack.Checked
End Function
Public Function cmdAdd_OnClick()
cboDropDown.Items.Add cboDropDown.Items.Count,
cboDropDown.Items.Count,False
End Function
Public Function cmdRemove_OnClick()
cboDropDown.Items.Remove cboDropDown.Items.Count-1
End Function
Public Function chkListBox_Click()
if chkListBox.Checked Then
cboDropDown.Rows = 10
cboDropDown.Multiple = True
cboDropDown.Items.Mode = 2
Else
cboDropDown.Rows = 1
cboDropDown.Multiple = False
cboDropDown.Items.Mode = 1
End If
End Function
%>
关注点
开发核心花了我大约 4-5 天的时间。 每个控件花了我 1-3 个小时(除了 DataGrid,它花了我一两天的时间!)。
在完成所有工作后,我学到了很多东西,例如当恢复具有相应 HTML 输入(文本框、下拉列表等)的控件的 viewstate 时的所有棘手的事情。 当它们不可见、禁用、渲染或未渲染时,它们的行为会有所不同... 这非常有趣!
历史
- 当前版本为 1.3(生产稳定)