2009-06-12 10 views
1

複数ページの登録フォームの状態パターンを実装しようとしています。各ページのデータは蓄積され、セッションオブジェクトに格納されます。ASP.NETにおける複数ページフォームの状態パターンによる検証

ページレベルまたは各状態クラス内で検証(DBへのサービスレイヤ呼び出しを含む)を行う必要がありますか?言い換えれば、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

検証はすべてのステップ/ページで確実に行われます。問題は、データがStateクラスに送られる前に、IStateの具体的な実装やページ上でサーバー側の検証が行われるかどうかです(EmptyFormState.SubmitDataメソッドを見てください)。州の授業はどのように愚かなのですか?彼らは自分の健全性チェックをすべきか? – philrabin

関連する問題