【问题标题】:Validate all wizard steps on FinishButtonClick验证 FinishButtonClick 上的所有向导步骤
【发布时间】:2012-10-21 17:50:01
【问题描述】:

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

我要做的是在用户单击完成按钮或用户进入摘要页面时检查所有控件的状态(或运行所有验证器)。我已经尝试通过这样做来运行 FinishButtonClick 事件中的所有验证器:

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

e.Cancel = !validates;

但是当我这样做时,每个验证者都声称它们是有效的。我还尝试将所有控件设置为 Visible = true;在此代码块之前,但这没有效果。知道有什么问题吗?或者这是一种更好的方法,也许是我缺少的向导控件的本机功能?

【问题讨论】:

    标签: c# asp.net validation aspwizard


    【解决方案1】:

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

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

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

    附:您不需要遍历所有验证器并检查它们是否有效。只需使用 Page.Validate() (您甚至可以将 ValidationGroup 传递给此方法),然后检查 Page.IsValid 布尔值。

    编辑: 根据下面的cmets:

    页面属性:

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

    下一页点击或侧边栏点击:

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

    【讨论】:

    • 我担心是这样的。问题是向导表单的要求之一是它应该可以独立于上一个/下一个按钮进行导航。感谢 Page.Validate / IsValid 的提示。我首先尝试了这个,但由于它没有返回我期望的结果,所以我尝试迭代所有验证器。也许我应该跟踪哪些 WizardSteps 已经被渲染(和验证),然后拒绝进入摘要页面......
    • 你可以按照你的建议去做。页面完成后将其添加到您的 ViewState。然后,当您单击“完成”按钮时,您可以检查哪些页面已完成和验证,并向用户显示一条消息,要求完成第 n、n 和 n 页。
    • 谢谢,我选择了这个的变体。我跟踪具有最高索引的 WizardStep 的索引,该索引也已经过验证(存储在 ViewState 中)。当用户在向导中向前导航时,访问被拒绝并显示错误消息 if ((e.NextStepIndex - 1) > this.CurrentWizardStep)。
    【解决方案2】:

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

    【讨论】:

    • 不会触发同样的“错误”吗?发生此事件时当前 WizardStep 中不存在的控件将具有相同的状态(表明它们有效),而实际上它们不是。单击侧边栏中的链接时,当前步骤的验证已运行。
    • @Erik 如果问题是用户错过了向导中的步骤,我想你可以使用 WizardNavigationEventArgs 的 CurrentStepIndex 属性和 NextStepIndex 属性来禁止这个?
    • 感谢您的建议。我接受了 Jamie 的回答,因为他的回答更有助于解决问题。事实上,我确实最终取消了 SideBarButtonClick 中的事件,所以感谢您的建议。这值得一票;)
    猜你喜欢
    • 2018-11-06
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-02-02
    • 2023-03-18
    相关资源
    最近更新 更多