【问题标题】:asp.net RequiredFieldValidators with same validation group do not fire at same time具有相同验证组的 asp.netRequiredFieldValidator 不会同时触发
【发布时间】:2014-03-22 10:38:23
【问题描述】:

我有一个带有 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 - 没有帮助

问题

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

【问题讨论】:

    标签: javascript html asp.net .net validation


    【解决方案1】:

    这不是很奇怪,

    简单的答案是:

    验证控制渲染流程先调用requirefieldvalidator,再调用rangevalidator,然后...... 所以当你点击按钮时,首先调用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 将调用。

    所以请检查并确定 RegularExpressionValidator 是否在第二个按钮点击后触发????并参考这个msdn

    【讨论】:

    • 您的描述是准确的,但它没有解决在不同时间触发相同类型的验证器。不过谢谢
    【解决方案2】:

    结果证明,如果某些验证器使用 Display="Dynamic" 而有些不使用,它们会在不同的时间进行验证。一旦我将 Display="Dynamic" 放入它们同时触发的所有验证器中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      相关资源
      最近更新 更多