Проверьте все шаги мастера на FinishButtonClick - PullRequest
2 голосов
/ 08 ноября 2010

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

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

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

e.Cancel = !validates;

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

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

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

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

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

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

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

Свойство Page:

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

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

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

Page.Validate("PageOne");
PageOneValid = Page.IsValid;
3 голосов
/ 08 ноября 2010

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

...