Introduction
With the Classic ASP Framework you will be able to structure your ASP pages pretty much the same way you would do it in ASP.NET. The beauty of the Framework is that it includes most of the controls found in ASP.NET such as the TextBox, Label, GenericHTML, DropDown, CheckBox, CheckBoxList, RadioButtonList,DataRepeater, DataList, DataTable and MORE! The Framework is event driven and supports ViewState!
Background
So, why did I take the time to do this, you may ask, specially when ASP.NET is so great and does everything you need. Well, the main reason is because I work as a consultant and there are still quite a bit of ASP websites around that require maintenance and support. After I learned .NET I felt in love with it and I did not want to code in any other way anymore. So I decided to take the most important pieces of it and create a similar one on Classic ASP.
The main benefits are:
- Coding takes a lot less time, is more readable and easier to maintain.
- Event driven model.
- Simplifies the migration to ASP.NET.
Screenshots
Using the code
Using the code is pretty simple. Just include the "WebControl.asp" file and a reference to each Server Control (each one is wrapped in its own ASP file) that you want to use to your ASP page. After you include the references then you need to write code inside each event you want to handle.
The Form is taken care of by the Framework. Just include FormStart.asp when the form starts and FormEnd.asp when you need to clode the form tag. This two includes will make sure that all necessary hidden fields are included. The last thing that has to be done is to the Main() method (included in the WebControls.asp). This method will do the magic. I call it the "Page Controler" because it coordinates the execution of all the events in the appropriate order. This method should only be called after the declaration of all the includes and BEFORE rendering any control.
The Framework includes several examples that show how it works.
WebControl.asp contains the core classes: WebControl and Page. All controls "inherit" from WebControl (including the Page class). Now, wait a second, inherits in VbScript?. Not really, I "simulated" inheritance by having each WebControl variable inside each Server Control.
In addition to this, you need to register one COM Comnponent (ASPFramework.dll) which is used to encapsulate the ViewState (which is XML), the Base64 functions and the ListItemCollection. It is a VB Class and the source code is provided. The only reason for using a VB Class is for speed purposes. We don't want to encrypt/decrypt in VBScript!.
**List of supported events that can be overloaded (they don't need to be defined!)
Page_Authenticate_Request
Page_Authorize_Request
Page_Init
Page_Controls_Init
'Ocurrs just once, when the page is first loaded!
Page_LoadViewState
Page_Load
Page.HandleClientEvent
Page_PreRender
Page_SaveViewState
For Server Controls
<!---->
<!---->
<!---->
<!---->
<!---->
<!---->
<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>
<!---->
<%
Call Main()
%>
<Span Class="Caption">DROPDOWN EXAMPLES</Span>
-->
<%lblMessage%><HR>
<%chkHideShow%> | <%chkAutoPostBack%> | <%chkListBox%><HR>
<%cboDropDown%>
<HR>
<%cmdAdd%> | <%cmdRemove%>
-->
</BODY>
</HTML>
<%
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()
Set cboDropDown.DataSource = Nothing
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
%>
Points of Interest
Developing the core took me about 4-5 days. Each control took me 1-3 hours (with the exception of the DataGrid, which took me a day or two!).
After the whole thing was done I learned quite a few things such as all the tricky things when you restore the viewstate for controls that have a corresponding HTML Input (text boxes, drop downs, etc). They behave differently when they are invisible, disabled, rendered or not rendered... it was quite fun!.
History
- The current version is 1.3 (production stable)