我有一个 asp:wizard
控件,其中包含五个 WizardSteps。所有这些步骤都有表单控件,并且大多数控件都有验证器。当用户使用下一个和上一个按钮逐步完成向导时,一切都运行良好,并且验证会按预期触发。但是,如果用户选择使用侧栏中的链接来导航向导,则他或她可以跳过某些步骤。当提交最后一页(这是一个摘要页)时,向导中的控件可能无效。
我想要做的是当用户单击完成按钮或用户进入摘要页面时检查所有控件的状态(或运行所有验证器)。我尝试通过执行以下操作来运行 FinishButtonClick 事件中的所有验证器:
bool validates = true;
foreach (IValidator validator in this.Validators) {
validator.Validate();
if (!validator.IsValid) {
validates = false;
}
}
e.Cancel = !validates;
但是当我这样做时,每个验证器都声称它们是有效的。我还尝试将所有控件设置为 Visible = true;在此代码块之前,但这没有效果。知道可能出什么问题吗?或者这是一种更好的方法,也许是我缺少的向导控件的 native 函数?
最佳答案
您无法执行此操作,因为您尝试验证的控件未在页面上呈现。即验证器不存在,因此 Page.Validate()
和 Page.IsValid
将返回 true,因为没有验证器,所以一切都是有效的。我希望这是有道理的?
转到“查看源代码”,您将看到源代码仅包含向导当前步骤的标记。因此,前面页面上的任何验证器都不会呈现,因此不会被检查。
我建议隐藏侧边栏。这样,用户就无法跳过页面,并且当他们单击“下一步”时,将验证当前控件,因此只有在完成了所在页面后才能继续。
附注您不需要循环遍历所有验证器并检查它们是否有效。只需使用 Page.Validate()(您甚至可以将 ValidationGroup 传递给此方法),然后检查 Page.IsValid bool 值。
编辑: 根据以下评论:
页面属性:
public bool PageOneValid
{
get
{
if (ViewState["PageOneValid"] == null)
return false;
return (bool)ViewState["PageOneValid"];
}
set
{
ViewState["PageOneValid"] = value;
}
}
在页面上下一次单击或侧边栏单击:
Page.Validate("PageOne");
PageOneValid = Page.IsValid;
关于c# - 验证 FinishButtonClick 上的所有向导步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124090/