具有相同验证组的asp.net RequiredFieldValidators不会同时触发

时间:2014-02-21 04:52:35

标签: javascript html asp.net .net validation

我有一个带有6-12个必填字段验证器的aspx用户控件。当我单击与验证器具有相同验证组的提交按钮时,只有一些验证器显示其错误消息,然后一旦更正这些错误消息并再次单击该按钮,其他验证器将显示其消息。这很令人困惑。

以下是两个文本框(在上下文中)的简化标记以及与验证组关联的按钮。

<%-- PRODUCT DETAIL --------------------------------------------------- --%>
<dl class="accordion" data-accordion="">
    <dd>
        <a href="#PanelProductDetail">Product Detail</a>
        <div id="PanelProductDetail" class="content active">
            <fieldset>
                <%--<legend>Product Detail</legend>--%>
                <div class="row">
                    <%-- NAME --------------------------------------------------- --%>
                    <div class="medium-4 small-12 columns">
                        <label>
                            Product Name  <small>Required</small>
                            <asp:TextBox id="tbName" type="text" placeholder="Product Name" runat="server" />
                            <asp:RequiredFieldValidator runat="server" ID="rfvName" ControlToValidate="tbName" 
                                Text="Please add a product Name" CssClass="error" ValidationGroup="AddProduct" 
                                display="Dynamic"  />
                        </label>
                    </div>
            </fieldset>
        </div>
    </dd>
</dl>


<%-- PRODUCT PRICING AND INVENTORY --------------------------------------------------- --%>
<dl class="accordion" data-accordion="">
    <dd>
        <a href="#PanelProductPricing">Product Pricing and Inventory</a>
        <div id="PanelProductPricing" class="content active">
            <fieldset>
                <div class="row">
                    <%-- PRICE ------------------------------------------%>
                    <div class="medium-4 small-12 columns collapse">
                        <div class="row collapse">
                            <label>Price  <small>Required</small></label>
                            <div class="small-2 columns">
                                <span class="prefix">$</span>
                            </div>
                            <div class="small-10 columns">
                                <asp:TextBox runat="server" ID="tbPrice" placeholder="Retail Price" />
                            </div>
                            <asp:RequiredFieldValidator runat="server" ID="rfvPrice" ControlToValidate="tbPrice" Display="Dynamic" 
                                Text="Please enter a price" CssClass="error" ValidationGroup="AddProduct" />
                            <asp:RegularExpressionValidator ID="rexvPrice" runat="server" ControlToValidate="tbPrice" Text="Invalid value for price"
                                ValidationExpression="^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$" 
                                ValidationGroup="AddProduct" CssClass="error" 
                                display="Dynamic" />
                        </div>
                    </div>
                </div>
            </fieldset>
        </div>
    </dd>
</dl>

<div class="row">
    <div class="large-3 medium-4 small-6 columns">
        <asp:Button ID="btnSubmit" runat="server" Text="Add Product" CssClass="button postfix" CausesValidation="true" ValidationGroup="AddProduct" />
    </div>
</div>

发生了什么(摘要)

在此示例中,tbPrice在第一次单击按钮时会收到错误消息,只有在文本框中输入了一个值,然后再次单击“提交”按钮,tbName验证程序才会显示错误。

我尝试了什么

  1. 我认为可能存在JS冲突,所以我删除了包装 手风琴标记 - 没有解决它
  2. 我尝试更改控件在标记中出现的顺序 - 没有 帮助
  3. 我尝试删除display = dynamic - no help
  4. 问题

    有人可以帮我弄清楚为什么只有一些验证器在第一次点击按钮时被调用,然后在第一个验证器修复错误后调用剩余的验证器。

2 个答案:

答案 0 :(得分:1)

这不是很奇怪,

简单的答案是:

  

验证控制渲染流程首先调用requirefieldvalidator,然后调整范围验证器,然后......   因此,当您单击按钮时,首先调用requirefieldvalidator

您为一个输入字段使用了两个验证控件

 <asp:RequiredFieldValidator runat="server" ID="rfvPrice" ControlToValidate="tbPrice" Display="Dynamic" 
                                Text="Please enter a price" CssClass="error" ValidationGroup="AddProduct" />
                            <asp:RegularExpressionValidator ID="rexvPrice" runat="server" ControlToValidate="tbPrice" Text="Invalid value for price"
                                ValidationExpression="^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$" 
                                ValidationGroup="AddProduct" CssClass="error" 
                                display="Dynamic" />

1)asp:RequiredFieldValidator

2)asp:RegularExpressionValidator

  

首先触发所有RequiredFieldValidator单击按钮时,一旦RequiredFieldValidator为false,则将调用RegularExpressionValidator。

所以请检查并确定是否在secon按钮中触发RegularExpressionValidator点击????并参考此msdn

答案 1 :(得分:0)

答案结果是,如果某些验证器使用Display =“Dynamic”,有些验证器不会在不同时间验证。一旦我将Display =“Dynamic”放在他们同时解雇的所有验证器中。