2010-11-08 64 views
2

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

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

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

e.Cancel = !validates; 

但是当我这样做的每个验证声称它们是有效的。我也尝试将所有控件设置为Visible = true;在此代码块之前,但这没有效果。任何想法可能是错的?或者是这样做的更好的方式,也许是我失踪的向导控件的本地函数?

回答

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; 
+0

我担心这是这样的。问题是向导窗体的一个要求是应该可以独立于prev/next按钮进行导航。感谢Page.Validate/IsValid的提示。我先试了一下,但是因为它没有返回我期望的结果,所以我尝试迭代所有验证器。也许我应该跟踪已渲染(和验证)的哪些WizardSteps,然后拒绝进入摘要页面...... – Erik 2010-11-08 13:56:30

+0

您可以按照您的建议进行操作。当页面完成后,将其添加到您的ViewState中。然后,当你点击'完成'按钮时,你可以检查哪些页面已经完成和验证,并向用户显示一条消息,要求完成页面n,n和n。 – Jamie 2010-11-08 14:11:36

+0

谢谢,我带着这个变化去了。我跟踪具有最高索引的WizardStep的索引,该索引也被验证(存储在ViewState中)。当用户在向导中向前导航时,如果((e.NextStepIndex - 1)> this.CurrentWizardStep)访问被拒绝并显示错误消息。 – Erik 2010-11-08 16:13:33

3

一个选项是验证SideBarButtonClick事件中的页面状态,如果验证失败,则将Cancel设置为true。那么你的用户不应该到达包含无效数据的摘要页面。

+0

会不会触发同样的“错误“?当发生此事件时,当前WizardStep中不存在的控件在实际上不具有相同状态时(说明它们有效)。单击SideBar中的链接时,当前步骤的验证已经运行。 – Erik 2010-11-08 13:48:34

+0

@Erik如果问题是用户错过了thw向导中的步骤,我认为您可以使用CurrentStepIndex属性和WizardNavigationEventArgs的NextStepIndex属性来禁止此操作? – stuartd 2010-11-08 14:13:21

+0

感谢您的建议。我接受了杰米的回答,因为他的回答更有助于解决方案。事实上,我最终取消了SideBarButtonClick中的事件,所以感谢您的建议。这值得赞赏;) – Erik 2010-11-08 16:17:57