Validation with State Pattern for Multi-Page Forms in ASP.NET

Posted by philrabin on Stack Overflow See other posts from Stack Overflow or by philrabin
Published on 2009-06-12T21:06:40Z Indexed on 2010/04/01 23:03 UTC
Read the original article Hit count: 342

I'm trying to implement the state pattern for a multi-page registration form. The data on each page will be accumulated and stored in a session object.

Should validation (including service layer calls to the DB) occur on the page level or inside each state class? In other words, should the concrete implementation of IState be concerned with the validation or should it be given a fully populated and valid object? See "EmptyFormState" class below:

namespace Example
{
	public class Registrar
	{
		private readonly IState formEmptyState;
		private readonly IState baseInformationComplete;

		public RegistrarSessionData RegistrarSessionData { get; set;}

		public Registrar()
		{
			RegistrarSessionData = new RegistrarSessionData();
			formEmptyState = new EmptyFormState(this);
			baseInformationComplete = new BasicInfoCompleteState(this);
			State = formEmptyState;
		}

		public IState State { get; set; }

		public void SubmitData(RegistrarSessionData data)
		{
			State.SubmitData(data);            
		}

		public void ProceedToNextStep()
		{
			State.ProceedToNextStep();
		}
	}





	//actual data stored in the session
	//to be populated by page
	public class RegistrarSessionData
	{        

		public string FirstName { get; set; }
		public string LastName { get; set; }
		//will include values of all 4 forms
	}





	//State Interface
	public interface IState
	{
		void SubmitData(RegistrarSessionData data);
		void ProceedToNextStep();

	}

	//Concrete implementation of IState
	//Beginning state - no data
	public class EmptyFormState : IState
	{
		private readonly Registrar registrar;

		public EmptyFormState(Registrar registrar)
		{
			this.registrar = registrar;
		}

		public void SubmitData(RegistrarSessionData data)
		{    
			//Should Validation occur here? 
			//Should each state object contain a validation class? (IValidator ?)
			//Should this throw an exception?
		}

		public void ProceedToNextStep()
		{
			registrar.State = new BasicInfoCompleteState(registrar);
		}
	}

	//Next step, will have 4 in total
	public class BasicInfoCompleteState : IState
	{
		private readonly Registrar registrar;

		public BasicInfoCompleteState(Registrar registrar)
		{
			this.registrar = registrar;
		}

		public void SubmitData(RegistrarSessionData data)
		{            
			//etc
		}

		public void ProceedToNextStep()
		{        
			//etc
		}
	}
}

© Stack Overflow or respective owner

Related posts about design-patterns

Related posts about form-validation