2

asp:wizard5 つの WizardSteps を含むコントロールがあります。これらのすべてのステップにはフォーム コントロールがあり、これらのコントロールのほとんどにはバリデータがあります。ユーザーが [次へ] ボタンと [前へ] ボタンを使用してウィザードを進めると、すべてがうまく機能し、検証が適切にトリガーされます。ただし、ユーザーがサイドバーのリンクを使用してウィザードをナビゲートすることを選択した場合、一部の手順をスキップできます。最後のページ (概要ページ) が送信されると、ウィザードのコントロールが無効になる場合があります。

私がやりたいことは、ユーザーが終了ボタンをクリックしたとき、またはユーザーが概要ページに入ったときに、すべてのコントロールの状態を確認する (またはすべてのバリデーターを実行する) ことです。これを行うことで、FinishButtonClick イベントですべてのバリデーターを実行しようとしました。

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

e.Cancel = !validates;

しかし、私がこれを行うと、すべてのバリデーターが有効であると主張します。また、すべてのコントロールを Visible = true; に設定しようとしました。このコードブロックの前に、これは効果がありません。何が間違っている可能性がありますか?それとも、これを行うより良い方法ですか?おそらく、私が見逃しているウィザードコントロールのネイティブ関数ですか?

4

2 に答える 2

3

1 つのオプションは、 SideBarButtonClickイベントでページの状態を検証し、検証に失敗した場合にを設定Cancelすることです。trueそうすれば、ユーザーが無効なデータを含む概要ページに到達することはありません。

于 2010-11-08T13:19:09.660 に答える
3

検証しようとしているコントロールがページにレンダリングされていないため、これを行うことはできません。つまり、バリデーターが存在しないため、バリデーターが存在しないPage.Validate()ためPage.IsValidtrue が返され、すべてが有効になります。理にかなっていると思いますか?

[ソースの表示] に移動すると、ソースにはウィザードの現在のステップのマークアップのみが含まれていることがわかります。そのため、前のページのバリデーターはレンダリングされないため、チェックされません。

サイドバーを非表示にすることをお勧めします。そうすれば、ユーザーはページをスキップできず、[次へ] をクリックすると現在のコントロールが検証されるため、現在のページを完了した場合にのみ続行できます。

PSすべてのバリデーターをループして、それらが有効であることを確認する必要はありません。Page.Validate() を使用して (ValidationGroup をこのメソッドに渡すこともできます)、Page.IsValid ブール値を確認します。

編集:以下のコメントに従って:

ページ プロパティ:

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

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

ページで次のクリックまたはサイドバーのクリック:

Page.Validate("PageOne");
PageOneValid = Page.IsValid;
于 2010-11-08T13:21:16.607 に答える