2009-06-12 41 views
1

我試圖爲多頁註冊表單實現狀態模式。每個頁面上的數據將被累積並存儲在會話對象中。使用狀態模式驗證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 
     } 
    } 
} 

回答

0

我更喜歡在狀態(集合)級別和最終落實兩者上進行驗證。一般而言,我更願意儘快驗證,作爲良好用戶體驗的一部分。從數據驗證/保護級別來看,我更願意在最終的保存/提交級別進行驗證,以防萬一隱藏通過,防止一般欺騙,或者(更可能)在將來保存/提交點的不同路由。

+0

驗證肯定會發生在每個步驟/頁面。問題是:如果服務器端驗證發生在IState的具體實現內部或頁面上,在將數據提供給狀態類之前(查看EmptyFormState.SubmitData方法)?州級應該是多麼愚蠢?他們應該做自己的理智檢查嗎? – philrabin 2009-06-12 21:48:39