一个ClientValidationFunction的多个自定义验证器混乱标签

时间:2015-04-27 21:36:01

标签: javascript jquery asp.net

我有4个文本框,用于搜索表格的2个不同日期列。 (用户可以为每列放置一个范围)。使用任何日期都是完全可选的,因此我创建了4个CustomValidators来使用相同的ClientValidationFunction。 (我不能使用Range或Required Validator,因为它们是可选的)。这是自定义功能:

function ValidateDateRange(s, args) {
        var startDate;
        var endDate;
        var conToValSplit = document.getElementById(s.controltovalidate).id.split("_");
        var controlToValidate = conToValSplit[conToValSplit.length - 1];

        switch (controlToValidate) {
            case "txtFirstStartDate":
                startDate = document.getElementById("<%= txtFirstStartDate.ClientID %>").value;
                endDate = args.Value;
                break;
            case "txtSecondStartDate":
                startDate = args.value;
                endDate = document.getElementById("<%= txtSecondStartDate.ClientID %>").value;
                break;
            case "txtSecondEndDate":
                startDate = document.getElementById("<%= txtSecondEndDate.ClientID %>").value;
                endDate = args.Value;
                break;
            default:
                startDate = args.Value;
                endDate = document.getElementById("<%= txtFirstEndDate.ClientID %>").value;
                break;
        }

        if (new Date(args.Value) == "Invalid Date"){
            $(s).text("Please enter a valid end date(mm/dd/yyyy).");
            args.IsValid = false;
            return;
        } 

        if (endDate != '') {
            if (new Date(startDate) > new Date(endDate)) {
                $(s).text("End date must be after start date.");
                args.IsValid = false;
                return;
            }

    args.IsValid = true;

    return;
    }

以下是文本框和CustomValidators:

<td class="StartDateLabel">Date From</td>
<td>
    <asp:TextBox runat="server" CssClass="StartDate" ID="txtFirStartDate" onBlur="DisplayInvalidLabel"/>
    <asp:CustomValidator ID="cusValFromDate" runat="server" ErrorMessage="End date must be after start date." ClientValidationFunction="ValidateDateRange" ControlToValidate="txtFirStartDate" 
        EnableClientScript="true" SetFocusOnError="true" ValidationGroup=""SearchGroup" CssClass=""Validator" Display="Dynamic">
    </asp:CustomValidator> 
    <span class="To Label"> to </span>
    <asp:TextBox runat="server" CssClass="EndDate" ID="txtFirstEndDate" onBlur="DisplayInvalidLabel"/>
    <asp:CustomValidator ID="cusValToDate" runat="server" ErrorMessage="End date must be after start date." ClientValidationFunction="ValidateDateRange" ControlToValidate="txtFirstEndDate"
        EnableClientScript="true" SetFocusOnError="true" ValidationGroup="SearchGroup" CssClass="Validator" Display="Dynamic">
    </asp:CustomValidator> 
</td>
<td class="StartDateLabel">Second Date From</td>
<td>
    <asp:TextBox runat="server" CssClass="StartDate" ID="txtSecondStartStart" ToolTip="This field allows for ranges. See LEGEND" onBlur="DisplayInvalidLabel()"/>
    <asp:CustomValidator ID="custSecStartVal" runat="server" ErrorMessage="End date must be after start date." ClientValidationFunction="ValidateDateRange" ControlToValidate="txtSecondStartStart"
        EnableClientScript="true" SetFocusOnError="true" ValidationGroup="SearchGroup" CssClass="Validator" Display="Dynamic">
    </asp:CustomValidator> 
</td>
<td class="To Label">Second  to</td>
<td>
    <asp:TextBox runat="server" CssClass="EndDate" ID="txtSecondEndDate" ToolTip="This field allows for ranges. See LEGEND" onBlur="DisplayInvalidLabel()"/>
    <asp:CustomValidator ID="custSecEndVal" runat="server" ErrorMessage="End date must be after start date." ClientValidationFunction="ValidateDateRange" ControlToValidate="txtSecondEndDate"
        EnableClientScript="true" SetFocusOnError="true" ValidationGroup="SearchGroup" CssClass="Validator" Display="Dynamic">
    </asp:CustomValidator>
</td>

验证工作正常。当我输入无效值时,相应的错误消息显示在定义的控件旁边。重点放在需要的地方。但是,如果我选中4个输入框,当我从第三个输入框中跳出时(&#34; txtSecondStartDate&#34;)如果我没有输入任何内容,那么我的消息来自&#34; txtFirstStartDate&#34;因剩余无效日期而消失。我知道它正在重新验证为真,但我错过了它在做什么?

对于所有文本框都是一样的。最初它可以工作,但如果我点击几次点击后有任何其他具有验证器的控件,它会清除应该保持无效的其他控件的消息。我无法看到它发生在哪里?

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。问题来自&#34; onBlur&#34;我在每个输入文本框中都有的事件。我把它绑定到另一个正在验证的功能上,因此当输入发生并且没有发生时它导致混淆。