使用状态模式验证ASP.NET中的多页表单
问题描述:
我试图为多页注册表单实现状态模式。每个页面上的数据将被累积并存储在会话对象中。使用状态模式验证ASP.NET中的多页表单
验证(包括对数据库的服务层调用)是否发生在页级别或每个状态类内部?换句话说,IState的具体实现应该与验证有关还是应该给予充分有效的对象?请参阅下面的“EmptyFormState”类:
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
}
}
}
答
我更喜欢在状态(集合)级别和最终落实两者上进行验证。一般而言,我更愿意尽快验证,作为良好用户体验的一部分。从数据验证/保护级别来看,我更愿意在最终的保存/提交级别进行验证,以防万一隐藏通过,防止一般欺骗,或者(更可能)在将来保存/提交点的不同路由。
验证肯定会发生在每个步骤/页面。问题是:如果服务器端验证发生在IState的具体实现内部或页面上,在将数据提供给状态类之前(查看EmptyFormState.SubmitData方法)?州级应该是多么愚蠢?他们应该做自己的理智检查吗? – philrabin 2009-06-12 21:48:39