ASP.NET Server Components
by Douglas Reilly

Listing One

<%@ Page Language="vb" AutoEventWireup="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>WebForm1</title>
		<meta content="Microsoft Visual Studio.NET 7.0" 
name="GENERATOR">
		<meta content="Visual Basic 7.0" name="CODE_LANGUAGE">
		<meta content="JavaScript" name="vs_defaultClientScript">
		<meta 
content=http://schemas.microsoft.com/intellisense/ie5 name="vs_targetSchema">
	</HEAD>
	<body>
	<form id="Form1" method="post" runat="server">
		<table width="500">
			<tr>
				<td align="right" width="33%">Old Password:
				</td>
				<td><asp:textbox id="OldPassword" 
runat="server" 
Width="100" 
TextMode="Password">
</asp:textbox></td>
				<td>
<asp:requiredfieldvalidator 
id="RequiredFieldValidator1" 
runat="server" 
display="Dynamic" ControlToValidate="OldPassword" ErrorMessage="*">
</asp:requiredfieldvalidator></td>
			</tr>
			<tr>
				<td align="right" width="33%">New Password:
				</td>
				<td>
<asp:textbox id="NewPassword" 
runat="server" Width="100" TextMode="Password">
</asp:textbox></td>
				<td>
<asp:requiredfieldvalidator 
id="RequiredFieldValidator2" 
runat="server" display="Dynamic" 
ControlToValidate="NewPassword" 
ErrorMessage="*">
</asp:requiredfieldvalidator>
</td>
			</tr>
			<tr>
				<td align="right" width="33%">Re-Enter:
				</td>
				<td>
<asp:textbox id="NewPassword2" 
	runat="server" Width="100" 
TextMode="Password">
</asp:textbox>
</td>
				<td>
<asp:requiredfieldvalidator 
id="RequiredFieldValidator3" 
runat="server" display="Dynamic" 
ControlToValidate="NewPassword2" 
ErrorMessage="*">
</asp:requiredfieldvalidator>
<asp:comparevalidator
id="CompareValidator1" 
runat="server" 
ControlToValidate="NewPassword2" 
ErrorMessage=
"Please enter and re-enter the same new password" 
ControlToCompare="NewPassword" 
Display="Dynamic">
</asp:comparevalidator>
</td>
			</tr>
			<tr>
				<td align="middle" colSpan="3">
<asp:button id="Button1" Runat="server" 
Text="Submit">
</asp:button>
</td>
			</tr>
		</table>
		</form>
	</body>
</HTML>


Listing Two
<%@ Register TagPrefix="DDJ" Namespace="DDJ" 
Assembly="FormatDateControl" %>
<%@ Page Language="vb" AutoEventWireup="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
	<HEAD>
		<title>WebForm2</title>
		<meta name="GENERATOR" 
content="Microsoft Visual Studio.NET 7.0">
		<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
		<meta name="vs_defaultClientScript" content="JavaScript">
		<meta name="vs_targetSchema" 
content="http://schemas.microsoft.com/intellisense/ie5">
	</HEAD>
	<body>
		<form id="Form1" method="post" runat="server">
			&nbsp;
			<table width="500">
				<tr>
					<td width="50%" align="right">
						SSN:
					</td>
					<td>
						<DDJ:ReformatSSN 
id="ReformatSSN1" 
runat="server">
</DDJ:ReformatSSN><br>
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<asp:Button id="Button1" 
runat="server" 
Text="Button">
</asp:Button>
					</td>
				</tr>
			</table>
		</form>
	</body>
</HTML>


Listing Three


using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;
using System.Text.RegularExpressions;

[assembly: TagPrefix("ReformatSSN","DDJ")]

namespace DDJ
{
	/// <summary>
	/// Summary description for WebCustomControl1.
	/// </summary>
	[DefaultProperty("Text"),
	ToolboxData("<{0}:ReformatSSN runat=server></{0}:ReformatSSN>")]
	public class ReformatSSN : System.Web.UI.WebControls.BaseValidator,
		IPostBackDataHandler,IPostBackEventHandler
	{
		private bool bIsValid;
	

		protected override bool EvaluateIsValid()
		{
			this.ServerFormatSSN();
			return bIsValid;
		}

		public ReformatSSN()
		{
			bIsValid=true;
			this.ErrorMessage="*";
			this.TextChanged=null;
		}

		[Bindable(true),
		Category("Appearance"),
		DefaultValue("")]
		override public String Text 
		{
			get 
			{
				return (String) ViewState["Text"];
			}
			set 
			{ 
				ViewState["Text"] = value;
			}                  
		}

		protected override void OnLoad(EventArgs e)
		{
			base.OnLoad(e);
			if ( Page.IsPostBack )
			{
				ServerFormatSSN();
				IsValid=bIsValid;
			}
			if ( Page.ClientTarget.ToLower()!="downlevel" )
			{
				Page.RegisterClientScriptBlock("FormatSSNClientScript",
	
			"<" + "SCRIPT Language=JavaScript " + 

"SRC=\"FormatSSN.js\"></" + "SCRIPT>");
			}
		}

		/// <summary>
		/// Render this control to the output parameter specified.
		/// </summary>
		/// <param name="output"> The HTML writer to write out to </param>
		protected override void Render(HtmlTextWriter output)
		{
			if ( Page.ClientTarget.ToLower()!="downlevel" )
			{
				output.Write("<INPUT TYPE=\"TEXT\" ID=" + 
					this.UniqueID + " Name= " +
					this.UniqueID + " Value=\"" + 
					Text + "\" OnChange=\"FormatSSN('" + 
					this.UniqueID + 
"');\" Size=10 maxlen=10>");
			}
			else
			{
				output.Write("<INPUT TYPE=\"TEXT\" ID=" + 
					this.UniqueID + " Name= " +
					this.UniqueID + " Value=\"" + 
					Text + "\" Size=10 maxlen=10>");
			}

			output.Write("<span id=val" + this.UniqueID + ">");
			if ( IsValid==false )
			{
				output.Write("<font color=" + 
this.ForeColor + ">" + 
					this.ErrorMessage + "</font>");
			}
			output.Write("</span>");
		}

		protected void ServerFormatSSN()
		{
			string tstr;
			System.Text.RegularExpressions.Match m;
			System.Text.RegularExpressions.Regex r;
			bIsValid=false;
			tstr=Text;
			try
			{
				r=new Regex("[0-9]{3}-[0-9]{2}-[0-9]{4}");
				m=r.Match(tstr);
				if ( m.Success==true )
				{
					bIsValid=true;
				}
				else
				{
					r=new Regex("[0-9]{9}");
					m=r.Match(tstr);
					if ( m.Success==true )
					{
						tstr=tstr.Substring(0,3) +
"-"+tstr.Substring(3,2)+
"-"+tstr.Substring(5,4);
						bIsValid=true;
					}
				}
			}
			catch(Exception )
			{
				bIsValid=false;
			}
		}

		// IPostBackDataHandler related items follow...
		public event EventHandler TextChanged;
            
		public virtual bool LoadPostData(string postDataKey, 
			NameValueCollection values) 
		{
			String presentValue = Text;
			String postedValue = values[postDataKey];
			try
			{
				if (!presentValue.Equals(postedValue))
				{
					Text = postedValue;
					return true;
				}
			}
			catch ( Exception  )
			{
				Text=postedValue;
			}
			return false;
		}
            
		public virtual void RaisePostDataChangedEvent() 
		{
			ServerFormatSSN();
			IsValid=bIsValid;
			OnTextChanged(EventArgs.Empty);     
		}

		public void RaisePostBackEvent(string EventArgument)
		{
			return;
		}
            
		protected virtual void OnTextChanged(EventArgs e)
		{
			if (TextChanged != null)
				TextChanged(this,e);
		}           
	}
}


Listing Four

// JScript source code

function FormatSSN(ControlName)
{
	var ctrl;
	var text;
	var dash1;
	var dash2;
	var loop;
	var pattern;
	var tstr;
	
	bIsSSN=false;
	
	dash1=-1;
	dash2=-1;
	ctrl=window.event.srcElement;
	tstr=ctrl.value;
	dash1=tstr.indexOf('-');
	if ( dash1>=0 )
	{
		dash2=tstr.indexOf('-',dash1+1);
	}
	if ( dash2<0 )
	{
		pattern=new RegExp("\\d{9}");
		if ( pattern.test(tstr)==true )
		{
			ctrl.value=tstr.substr(0,3)+
'-'+tstr.substr(3,2)+
'-'+tstr.substr(5,4);
			bIsSSN=true;
		}
	}
	else
	{
		if ( dash1==3 && dash2==6 )
		{
			pattern=new RegExp("\\d{3}\-\\d{2}\-\\d{4}");
			bIsSSN=pattern.test(tstr);
		}
	}
		
	if ( bIsSSN==false )
	{		
		alert('Invalid SSN');
	}
	return (bIsSSN);
}

 



