Проверка с помощью шаблона состояния для многостраничных форм в ASP.NET - PullRequest
2 голосов
/ 13 июня 2009

Я пытаюсь реализовать шаблон состояния для многостраничной регистрационной формы. Данные на каждой странице будут накапливаться и храниться в объекте сеанса.

Должна ли валидация (включая вызовы уровня сервиса в БД) происходить на уровне страницы или внутри каждого класса состояний? Другими словами, должна ли конкретная реализация 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
        }
    }
}

1 Ответ

0 голосов
/ 13 июня 2009

Я предпочитаю проверять как на уровне состояния (коллекции), так и на окончательном коммите. В целом, я предпочитаю проверить как можно скорее, как часть хорошего пользовательского опыта. На уровне проверки / защиты данных я предпочитаю проверять на конечном уровне сохранения / фиксации, а также на случай, если что-нибудь пробьется, защита от общего обмана или (более вероятно) другой маршрут к точке сохранения / фиксации в будущем.

...