3

我有一个带有两个自定义验证器的网络表单:

  • 用于验证字符串是否为日期。我不在乎什么格式,只要它是可解析的。
  • 另一个确保一个日期等于或大于另一个日期。我只是无法让比较验证器与任何日期格式配合得很好。
<asp:TextBox ID="txtResourceStartDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceStartDateIsDate" runat="server"
    ControlToValidate="txtResourceStartDate" Display="None"
    ErrorMessage="Start date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:TextBox ID="txtResourceEndDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceEndDateIsDate" runat="server"
    ControlToValidate="txtResourceEndDate" Display="None"
    ErrorMessage="End date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:CustomValidator Display="None" Text="" ID="valForStartEndDate" runat="server"
    OnServerValidate="ValidateStartEndDate"
    ErrorMessage="Last day must be greater than or equal to first day" />
protected void Date_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime outDate;
    args.IsValid = DateTime.TryParse(args.Value, out outDate);
}

protected void ValidateStartEndDate(object sender, ServerValidateEventArgs e)
{
    e.IsValid = DateTime.Parse(txtResourceEndDate.Text) >=
                DateTime.Parse(txtResourceStartDate.Text);
}

问题是ValidateStartEndDate验证器在验证器之前触发Date_ServerValidate,因此如果日期无效,则会在DateTime.Parse. 显然,这个验证器可以在解析之前检查一个有效的日期,但我真的更喜欢有一个带有适当消息的离散验证器。

所以问题是:什么决定了验证器触发的顺序?除非我遗漏了什么,否则不会在标签级别声明。

4

2 回答 2

2

你不能指望验证器会触发的特定顺序,你也不应该指望它。您必须自己确保订单无关紧要。

所以你可以

  1. 与 Equal-Greater-Check 同时检查有效日期。
  2. 首先调用您的 IsDate-Validator 的 Validate()-Function,然后检查它是否为 IsValid
  3. 所有验证器都添加到 Page.Validators 集合中,并且验证按顺序通过该集合运行。如果您的逻辑确实应该依赖此顺序:更改 ASPX-Page 中验证器的顺序

关于页面验证的一些有趣信息:http: //msdn.microsoft.com/en-us/library/aa479045.aspx

于 2010-07-15T07:42:54.270 回答
0

验证控件的执行顺序由ValidatorCollection返回的控件的顺序决定Page.Validators。反过来,此顺序由标记中验证控件的顺序确定,但有一些例外(例如,数据绑定控件中的验证器稍后将添加到集合中,因此将在最后添加)。

如果您CausesValidation=false在按钮上设置,然后使用 手动触发验证Page.Validate,则可以使用AddRemove方法ValidatorCollection来更改执行顺序:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) {
        // move myValidator to the very end, so it executes last
        Validators.Remove(myValidator);
        Validators.Add(myValidator);
    }
}

然后,稍后在触发控制中:

protected void myButton_Click(object sender, EventArgs e)
{
    Page.Validate();
    if (!Page.IsValid) { return; }

    // validation passed, proceed...
}

免责声明:所有这些都是经验性的,我还没有找到 MSDN 文档来支持它,但它似乎有效。

于 2014-06-09T16:44:20.903 回答