我有一个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;在此代码块之前,但这没有任何效果。知道什么可能是错的吗?或者它是一种更好的方法,也许是我缺少的向导控件的本机函数?
答案 0 :(得分:3)
一种选择是在SideBarButtonClick事件中验证页面状态,如果验证失败,则将Cancel
设置为true
。然后,您的用户永远不应该使用无效数据到达摘要页面。
答案 1 :(得分:3)
您无法执行此操作,因为您尝试验证的控件未在页面上呈现。即验证器不存在,因此Page.Validate()
和Page.IsValid
将返回true,因为没有验证器,所以一切都有效。我希望有道理吗?
转到“查看源”,您将看到源仅包含向导当前步骤的标记。因此,以前页面上的任何验证器都不会被渲染,因此不会被检查。
我建议隐藏SideBar。这样,用户无法跳过页面,当他们点击“下一步”时,将验证当前控件,因此只有在他们完成了他们所在的页面后才能继续。
P.S。您不需要遍历所有验证器并检查它们是否有效。只需使用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;