2

我有一个asp:wizard包含五个 WizardSteps 的控件。所有这些步骤都有表单控件,并且这些控件中的大多数都有验证器。当用户使用“下一个”和“上一个”按钮逐步完成向导时,一切正常,并且应按原样触发验证。但是,如果用户选择使用 SideBar 中的链接导航向导,他或她可以跳过一些步骤。提交最后一页(即摘要页)时,向导中的控件可能无效。

我想做的是在用户单击完成按钮或用户进入摘要页面时检查所有控件的状态(或运行所有验证器)。我已尝试通过执行以下操作在 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

一种选择是在SideBarButtonClick事件中验证页面状态,如果验证失败,则设置Cancel为。true那么您的用户不应该访问带有无效数据的摘要页面。

于 2010-11-08T13:19:09.660 回答
3

您不能这样做,因为您尝试验证的控件未呈现在页面上。即验证器不存在,因此Page.Validate()并且Page.IsValid将返回true,因为没有验证器,所以一切都是有效的。有道理,我希望?

转到查看源代码,您将看到源代码仅包含向导当前步骤的标记。因此,之前页面上的任何验证器都不会被渲染,因此也不会被检查。

我建议隐藏侧边栏。这样用户就不能跳过页面,当他们点击“下一步”时,当前的控件将被验证,所以他们只有在完成他们所在的页面后才能继续。

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 回答