Click here to Skip to main content
15,860,972 members
Articles / Programming Languages / ASP
Article

Classic ASP Framework - Make your Classic ASP code work like in ASP.NET

Rate me:
Please Sign up or sign in to vote.
4.80/5 (36 votes)
1 Feb 20043 min read 426.5K   4.4K   90   34
Developing in Classic ASP using the same technics as in ASP.NET?. If you have to work in Classic ASP, why don't do it the right way?. By using a similar framework not only your code will be more organized and efficient, but it will take you a fraction of the time to port to ASP.NET!

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

Image 1

Image 2

Image 3

Image 4

Image 5

Image 6

Image 7

Image 8

Image 9

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

  • OnInit
  • OnLoad

VBScript
<!--#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    
%>

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)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
Christian is a Microsoft Certified Professional 8+ years of experience in the consulting business. He has designed and developed numerous Web and Windows applications (and many other things he doesn't even remember...) using technologies and tools such as ASP.NET,VB.NET, C#, ASP, COM+/MTS, C++, JavaScript, HTML/DHTML, Visual Basic, SQL Server, Oracle, Microsoft Access, etc.

He is quite "curious" and always wants to know how things work and the "why was it done like this or that, how does this works...", and because of this he is always pursuing to improve his skills so he can know the answers to these questions.

He also likes Martial Arts, finishing and spending time with his wife and daughter. And why not?, playing XBOX from time to time :-P

Christian works as the Microsoft Technologies Manager/Senior Developer for Electronic Knowledge Interchange, a Chicago based Technology Consulting Firm.
http://www.eki-consulting.com

Comments and Discussions

 
QuestionLink to latest version? Pin
Strider7220-Oct-17 6:59
Strider7220-Oct-17 6:59 
AnswerRe: Link to latest version? Pin
Strider7220-Oct-17 8:43
Strider7220-Oct-17 8:43 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey31-Mar-12 0:39
professionalManoj Kumar Choubey31-Mar-12 0:39 
GeneralMy vote of 5 Pin
myClassic14-Nov-11 22:56
myClassic14-Nov-11 22:56 
GeneralMy vote of 5 Pin
Larry Boeldt20-Jul-10 16:43
Larry Boeldt20-Jul-10 16:43 
QuestionCSS ? Pin
José Rogério Nakamoto12-Mar-08 3:53
José Rogério Nakamoto12-Mar-08 3:53 
QuestionI dont suppose this can be run under windows CE? Pin
Member 391911617-Feb-08 12:59
Member 391911617-Feb-08 12:59 
QuestionCan it be run without the dll? Pin
davidlandy11-Jan-07 21:57
davidlandy11-Jan-07 21:57 
GeneralNice framework Pin
gabru0018-Nov-06 1:07
gabru0018-Nov-06 1:07 
GeneralIts Great.... Pin
aamironline19-Dec-05 20:41
aamironline19-Dec-05 20:41 
GeneralRe: Its Great.... Pin
Christian Calderon20-Dec-05 13:52
Christian Calderon20-Dec-05 13:52 
GeneralHelp! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
NeilMeredith2-Aug-04 10:33
NeilMeredith2-Aug-04 10:33 
GeneralRe: Help! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
Anonymous3-Aug-04 4:14
Anonymous3-Aug-04 4:14 
GeneralRe: Help! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
Anonymous3-Aug-04 4:16
Anonymous3-Aug-04 4:16 
GeneralRe: Help! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
kreont3-Oct-08 14:48
kreont3-Oct-08 14:48 
GeneralRe: Help! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
lrblouie3-Nov-08 10:18
lrblouie3-Nov-08 10:18 
GeneralRe: Help! &quot;ActiveX component can't create object: 'ASPFramework.ViewState'&quot; Pin
Ebemcham1-Dec-08 0:12
Ebemcham1-Dec-08 0:12 
GeneralThat fixed it! Pin
NeilMeredith3-Aug-04 10:47
NeilMeredith3-Aug-04 10:47 
GeneralCLASP Sample Site! Pin
Christian Calderon14-Jun-04 7:32
Christian Calderon14-Jun-04 7:32 
GeneralRe: CLASP Sample Site! Pin
Christian Calderon10-Oct-04 15:21
Christian Calderon10-Oct-04 15:21 
GeneralBase64 does not support DBCS characters Pin
Anonymous12-Feb-04 22:32
Anonymous12-Feb-04 22:32 
Generalnew base64 class Pin
Member 110875413-Feb-04 1:00
Member 110875413-Feb-04 1:00 
GeneralRe: new base64 class Pin
Christian Calderon13-Feb-04 7:31
Christian Calderon13-Feb-04 7:31 
GeneralRe: new base64 class Pin
jiangjianxiao13-Feb-04 15:13
jiangjianxiao13-Feb-04 15:13 
GeneralRe: new base64 class Pin
Christian Calderon13-Feb-04 16:22
Christian Calderon13-Feb-04 16:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.