2010-11-08 3 views
2

У меня есть элемент управления asp:wizard, который содержит пять WizardSteps. Все эти шаги имеют элементы управления формой, и большинство из этих элементов управления имеют валидаторы. Когда пользователь запускает мастер с помощью следующей и предыдущей кнопок, все работает отлично, и триггеры проверки, как и должно быть. Однако, если пользователь выбирает навигацию с помощью ссылок в SideBar, он или она могут пропустить некоторые шаги. Когда отправляется последняя страница (которая является сводной страницей), могут быть элементы управления в недействительном мастере.Подтвердить все шаги мастера на FinishButtonClick

Что я хочу сделать, это проверить состояние всех элементов управления (или запустить все проверки), когда пользователь нажимает кнопку завершения или когда пользователь вводит итоговую страницу. Я сделал попытку запустить все валидаторы в случае FinishButtonClick делая это:

bool validates = true; 
foreach (IValidator validator in this.Validators) { 
    validator.Validate(); 
    if (!validator.IsValid) { 
     validates = false; 
    } 
} 

e.Cancel = !validates; 

Но когда я делаю это каждый валидатор утверждает, что они являются действительными. Я также попытался установить все элементы управления в Visible = true; до этого кодового блока, но это не влияет. Любая идея, что может быть неправильным? Или это лучший способ сделать это, может быть, родная функция для элемента управления мастером, которого я пропускаю?

ответ

3

Вы не можете сделать это, потому что элементы управления, которые вы пытаетесь проверить, не отображаются на странице. то есть валидаторы не существуют, поэтому Page.Validate() и Page.IsValid вернут true, потому что нет валидаторов, поэтому все действительно. Надеюсь, я надеюсь?

Перейти к разделу «Просмотр источника», и вы увидите, что источник содержит только разметку для текущего шага мастера. Поэтому любые валидаторы на предыдущих страницах не отображаются и, следовательно, не проверяются.

Я бы предложил скрывать SideBar. Таким образом, пользователь не может пропускать страницы, и когда они нажимают «Далее», текущие элементы управления будут проверены, поэтому они могут быть продолжены, только если они завершили страницу, на которой они находятся.

P.S. Вам не нужно перебирать все валидаторы и проверять, что они действительны. Просто используйте Page.Validate() (вы даже можете передать ValidationGroup этому методу), а затем проверьте значение Page.IsValid boolean.

EDIT: Согласно комментариям ниже:

Страница собственности:

public bool PageOneValid 
{ 
    get 
    { 
     if (ViewState["PageOneValid"] == null) 
      return false; 

     return (bool)ViewState["PageOneValid"]; 
    } 
    set 
    { 
     ViewState["PageOneValid"] = value; 
    } 
} 

На странице один следующий клик или боковой панели нажмите:

Page.Validate("PageOne"); 
PageOneValid = Page.IsValid; 
+0

Я боялся, что это было что-то вроде этого.Проблема в том, что одним из требований к форме мастера является возможность навигации независимо от кнопок prev/next. Спасибо за подсказку на странице. Validate/IsValid. Я попробовал это первым, но поскольку он не вернул то, что я ожидал, я попытался перебрать все валидаторы. Возможно, мне следует отслеживать, какие WizardSteps были отображены (и проверены), а затем запретить вход на итоговую страницу ... – Erik

+0

Вы могли бы сделать то, что предложили. Когда страница завершена, добавьте ее в ViewState. Затем, когда вы нажимаете кнопку «Готово», вы можете проверить, какие страницы были заполнены и проверены, и отобразить сообщение пользователю, запрашивающему заполнение страниц n, n и n. – Jamie

+0

Спасибо, я пошел с вариацией этого. Я отслеживаю индекс WizardStep с самым высоким индексом, который также был проверен (сохранен в ViewState). Когда пользователь перемещается вперед в мастере, доступ запрещен и отображается сообщение об ошибке, если ((e.NextStepIndex - 1)> this.CurrentWizardStep). – Erik

3

Один из вариантов заключается в том, чтобы проверить состояние страницы в событии SideBarButtonClick, установив Cancel на true, если он не прошел проверку. Тогда ваши пользователи никогда не должны доходить до итоговой страницы с недопустимыми данными.

+0

не то, что бы вызвать такое же «ошибка «? Элементы управления, которые не присутствуют в текущем WizardStep при возникновении этого события, будут иметь одно и то же состояние (заявив, что они действительны), когда они на самом деле не являются. Проверка текущего шага уже выполняется при нажатии ссылки в SideBar. – Erik

+0

@Erik Если проблема заключается в том, что пользователь пропускает шаги в ww ww, я думал, что вы можете использовать свойство CurrentStepIndex и свойства NextStepIndex WizardNavigationEventArgs, чтобы запретить это? – stuartd

+0

Спасибо за ваши предложения. Я принял ответ Джейми, потому что его ответ помог больше в решении. Фактически, я прекратил отмену события в SideBarButtonClick, поэтому спасибо за ваш совет. Это заслуживает продолжения;) – Erik

Смежные вопросы