代码之家  ›  专栏  ›  技术社区  ›  Erik

在“完成”按钮上验证所有向导步骤单击

  •  2
  • Erik  · 技术社区  · 14 年前

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

    我要做的是在用户单击“完成”按钮或用户进入摘要页时检查所有控件的状态(或运行所有验证程序)。我尝试通过执行以下操作来运行FinishButtonClick事件中的所有验证程序:

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

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

    2 回复  |  直到 12 年前
        1
  •  3
  •   Paul Fleming    12 年前

    您不能这样做,因为您试图验证的控件没有呈现在页面上。也就是说,验证器不在,所以 Page.Validate() Page.IsValid 将返回true,因为没有验证器,所以所有内容都有效。我希望是有道理的?

    转到“查看源”,您将看到源只包含向导当前步骤的标记。所以之前页面上的任何验证程序都不会被呈现,因此也不会被检查。

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

    另外,您不需要遍历所有验证器并检查它们是否有效。只需使用page.validate()(甚至可以将validationgroup传递给此方法),然后检查page.isvalid布尔值。

    编辑: 根据以下评论:

    页面属性:

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

    在第1页上单击下一步或侧栏单击:

    Page.Validate("PageOne");
    PageOneValid = Page.IsValid;
    
        2
  •  3
  •   Paul Fleming    12 年前

    一个选项是验证 SideBarButtonClick 事件,设置 Cancel true 如果验证失败。那么,您的用户永远不应该使用无效数据访问摘要页。

    推荐文章