网格视图验证错误在不应该被触发的时候被触发

本文关键字:不应该 视图 验证 错误 网格 | 更新日期: 2023-09-27 18:03:02

我有一个gridview,在插入和编辑行时进行验证。插入工作良好。但是,当编辑一行时,当我单击"更新"时,会触发'Name'字段的RegularExpressionValidator。验证必须小于255个字符。字段小于该值,但始终显示错误消息。我使用这个验证在另一个网格中编辑,它工作得很好。我不知道为什么会触发这个错误。

下面是网格的标记:

<asp:GridView ID="SectionGridView" runat="server" AllowSorting="True" AutoGenerateColumns="False" Caption="Section Information" CaptionAlign="Top" 
    CssClass="grid" HorizontalAlign="Left" ShowFooter="True" AllowPaging="True" PageSize="4" ShowHeaderWhenEmpty="true" 
    OnPageIndexChanging="SectionGridView_PageIndexChanging" OnRowDataBound="SectionGridView_RowDataBound" OnRowCommand="SectionGridView_RowCommand" 
    OnRowCancelingEdit="SectionGridView_RowCancelingEdit" OnRowEditing="SectionGridView_RowEditing" OnRowUpdating="SectionGridView_RowUpdating">
    <Columns>
         <asp:TemplateField HeaderText="SectionID" SortExpression="cgvSectionID">
            <ItemTemplate>
                <asp:Label ID="sgvLblSectionID" runat="server" Text='<%# Bind("SectionID") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="CourseID">
            <EditItemTemplate>
                <asp:DropDownList ID="sgvDdlCourseID" runat="server" ></asp:DropDownList>
                <asp:Label ID="sgvEditLblCourseID" runat="server" Visible="false" Text='<%# Bind("CourseID") %>'></asp:Label>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblCourseID" runat="server" Text='<%# Bind("CourseID") %>'></asp:Label>
            </ItemTemplate>
             <FooterTemplate>
                <asp:TextBox ID="sgvInsertCourseID" runat="server" ReadOnly="true" Width="90%"></asp:TextBox>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Name" SortExpression="sgvName">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditName" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValEditName" ControlToValidate="sgvEditName" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="EditSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValEditName" ControlToValidate="sgvEditName" runat="server" 
                     ErrorMessage="Maximum length is 255." ValidationGroup="EditSectionValidation" ValidationExpression="^{1,255}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblName" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertName" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertName" ControlToValidate="sgvInsertName" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertName" ControlToValidate="sgvInsertName" runat="server" 
                     ErrorMessage="Maximum length is 255." ValidationGroup="InsertSectionValidation" ValidationExpression="^{1,255}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="SKU" SortExpression="sgvSKU">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditSKU" runat="server" Text='<%# Bind("SKU") %>'></asp:TextBox>
                 <asp:RequiredFieldValidator ID="ReqFieldValEditSKU" ControlToValidate="sgvEditSKU" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="EditSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValEditSKU" ControlToValidate="sgvEditSKU" runat="server" 
                     ErrorMessage="Enter alphanumeric, hyphen, or forward slash. Maximum length is 100." ValidationGroup="EditSectionValidation" ValidationExpression="^['w-/]{1,100}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblSKU" runat="server" Text='<%# Bind("SKU") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertSKU" runat="server" Width="90%"></asp:TextBox>
                 <asp:RequiredFieldValidator ID="ReqFieldValInsertSKU" ControlToValidate="sgvInsertSKU" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertSKU" ControlToValidate="sgvInsertSKU" runat="server" 
                     ErrorMessage="Enter alphanumeric, hyphen, or forward slash. Maximum length is 100." ValidationGroup="InsertSectionValidation" ValidationExpression="^['w-/]{1,100}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Registration Open Date" SortExpression="sgvRegOpenDate">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditRegOpenDate" runat="server" CssClass="datepick" Text='<%# Bind("RegistrationOpen", "{0:MM-dd-yyyy}") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblRegOpenDate" runat="server" Text='<%# Bind("RegistrationOpen", "{0:MM-dd-yyyy}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertRegOpenDate" runat="server" CssClass="datepick" Width="90%" ></asp:TextBox>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
         <asp:TemplateField HeaderText="Registration Close Date" SortExpression="sgvRegCloseDate">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditRegCloseDate" runat="server" CssClass="datepick" Text='<%# Bind("RegistrationClose", "{0:MM-dd-yyyy}") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblRegCloseDate" runat="server" Text='<%# Bind("RegistrationClose", "{0:MM-dd-yyyy}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertRegCloseDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Section Start Date" SortExpression="sgvSecStartDate">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditSecStartDate" runat="server" CssClass="datepick" Text='<%# Bind("SectionStart", "{0:MM-dd-yyyy}") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblSecStartDate" runat="server" Text='<%# Bind("SectionStart", "{0:MM-dd-yyyy}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertSecStartDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
         <asp:TemplateField HeaderText="Section End Date" SortExpression="sgvSecEndDate">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditSecEndDate" runat="server" CssClass="datepick" Text='<%# Bind("SectionEnd", "{0:MM-dd-yyyy}") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblSecEndDate" runat="server" Text='<%# Bind("SectionEnd", "{0:MM-dd-yyyy}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertSecEndDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
         <asp:TemplateField HeaderText="Member Price">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditMemberPrice" runat="server" Text='<%# Bind("MemberPrice", "{0:f}") %>'></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValEditMemberPrice" ControlToValidate="sgvEditMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="EditSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValEditMemberPrice" ControlToValidate="sgvEditMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="EditSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblMemberPrice" runat="server" Text='<%# Bind("MemberPrice", "{0:C}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertMemberPrice" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertMemberPrice" ControlToValidate="sgvInsertMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertMemberPrice" ControlToValidate="sgvInsertMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="InsertSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
         <asp:TemplateField HeaderText="Non-member Price">
            <EditItemTemplate>
                <asp:TextBox ID="sgvEditNonMemberPrice" runat="server" Text='<%# Bind("NonMemberPrice", "{0:f}") %>'></asp:TextBox>
                 <asp:RequiredFieldValidator ID="ReqFieldValEditNonMemberPrice" ControlToValidate="sgvEditNonMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="EditSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValEditNonMemberPrice" ControlToValidate="sgvEditNonMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="EditSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="sgvLblNonMemberPrice" runat="server" Text='<%# Bind("NonMemberPrice", "{0:C}") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="sgvInsertNonMemberPrice" runat="server" Width="90%"></asp:TextBox>
                 <asp:RequiredFieldValidator ID="ReqFieldValInsertNonMemberPrice" ControlToValidate="sgvInsertNonMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertNonMemberPrice" ControlToValidate="sgvInsertNonMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="InsertSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                 </asp:RegularExpressionValidator>
            </FooterTemplate>
            <HeaderStyle ForeColor="Black" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Action" ShowHeader="False">
            <EditItemTemplate>
                <asp:Button ID="sgvImgUpdate" runat="server" CausesValidation="True" ValidationGroup="EditSectionValidation"  CommandName="Update" Text="Update"></asp:Button>
                &nbsp;<asp:Button ID="sgvImgCancel" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:Button>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Button ID="sgvEditButton" runat="server" CausesValidation="false" CommandName="Edit" Text="Edit" Width="40%"></asp:Button>
                <asp:Button ID="sgvDeleteButton" runat="server" CausesValidation="false" CommandName="Delete" Text="Delete" Width="40%"></asp:Button>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
            <FooterTemplate>
                <asp:Button ID="sgvBtnAdd" runat="server" CommandName="Add" Text="Add Section" Width="90%" CausesValidation="true" ValidationGroup="InsertSectionValidation" />
            </FooterTemplate>
        </asp:TemplateField>
    </Columns>
    <EmptyDataTemplate>
        <tr> 
            <td colspan="11" style="text-align:center;">
            No section data was found for this course. Sections can be added to this course by clicking the 'Add Section' Button.
            </td>
        </tr>
        <tr>
            <td></td>
            <td><asp:TextBox ID="sgvInsertCourseID" runat="server" ReadOnly="true" Width="90%"></asp:TextBox></td>
            <td><asp:TextBox ID="sgvInsertName" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertNameEmpty" ControlToValidate="sgvInsertName" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertNameEmpty" ControlToValidate="sgvInsertName" runat="server" 
                     ErrorMessage="Maximum length is 255." ValidationGroup="InsertSectionValidation" ValidationExpression="^{1,255}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </td>
            <td><asp:TextBox ID="sgvInsertSKU" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertSKUEmpty" ControlToValidate="sgvInsertSKU" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertSKUEmpty" ControlToValidate="sgvInsertSKU" runat="server" 
                     ErrorMessage="Enter alphanumeric, hyphen, or forward slash. Maximum length is 100." ValidationGroup="InsertSectionValidation" ValidationExpression="^['w-/]{1,100}$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </td>
            <td><asp:TextBox ID="sgvInsertRegOpenDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox></td>
            <td><asp:TextBox ID="sgvInsertRegCloseDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox></td>
            <td><asp:TextBox ID="sgvInsertSecStartDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox></td>
            <td><asp:TextBox ID="sgvInsertSecEndDate" runat="server" CssClass="datepick" Width="90%"></asp:TextBox></td>
            <td><asp:TextBox ID="sgvInsertMemberPrice" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertMemberPriceEmpty" ControlToValidate="sgvInsertMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertMemberPriceEmpty" ControlToValidate="sgvInsertMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="InsertSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </td>
            <td><asp:TextBox ID="sgvInsertNonMemberPrice" runat="server" Width="90%"></asp:TextBox>
                <asp:RequiredFieldValidator ID="ReqFieldValInsertNonMemberPriceEmpty" ControlToValidate="sgvInsertNonMemberPrice" runat="server" 
                     ErrorMessage="Required field." ValidationGroup="InsertSectionValidation" Display="Dynamic" CssClass="message-error">
                </asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="RegExpValInsertNonMemberPriceEmpty" ControlToValidate="sgvInsertNonMemberPrice" runat="server" 
                     ErrorMessage="Enter currency format." ValidationGroup="InsertSectionValidation" ValidationExpression="^'$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$" 
                     Display="Dynamic" CssClass="message-error">
                </asp:RegularExpressionValidator>
            </td>
            <td><asp:Button ID="sgvBtnAddEmpty" runat="server" CommandName="Add" Text="Add Section" Width="90%" CausesValidation="true" ValidationGroup="InsertSectionValidation" /></td>
         </tr>
    </EmptyDataTemplate>
</asp:GridView>

这是后面的代码,尽管它在触发验证之前没有到达该方法。万一你需要它……

  protected void SectionGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow row = (GridViewRow)SectionGridView.Rows[e.RowIndex];
        //Save the current section and course selections
        int tiSectionID = Convert.ToInt32(ddlSections.SelectedValue.ToString());
        int tiCourseID = Convert.ToInt32((row.FindControl("sgvDdlCourseID") as DropDownList).SelectedValue);
        string tstrName = (row.FindControl("sgvEditName") as TextBox).Text;
        string tstrSKU = (row.FindControl("sgvEditSKU") as TextBox).Text;
        Nullable<DateTime> tdtRegOpenDate = setStartTime((row.FindControl("sgvEditRegOpenDate") as TextBox).Text);
        Nullable<DateTime> tdtRegCloseDate = setEndTime((row.FindControl("sgvEditRegCloseDate") as TextBox).Text);
        Nullable<DateTime> tdtSecStartDate = setStartTime((row.FindControl("sgvEditSecStartDate") as TextBox).Text);
        Nullable<DateTime> tdtSecEndDate = setEndTime((row.FindControl("sgvEditSecEndDate") as TextBox).Text);
        decimal tdMemberPrice = Convert.ToDecimal((row.FindControl("sgvEditMemberPrice") as TextBox).Text);
        decimal tdNonMemberPrice = Convert.ToDecimal((row.FindControl("sgvEditNonMemberPrice") as TextBox).Text);
        DAL.updateSections(tiSectionID, tiCourseID, tstrName, tstrSKU, tdtRegOpenDate, tdtRegCloseDate, tdtSecStartDate, tdtSecEndDate, tdMemberPrice, tdNonMemberPrice);
        //Refresh the section grid to include the updated row
        SectionGridView.EditIndex = -1;
        populateSectionGrid();
        //Refresh the dropdown list for sections
        populateDropDownSectionList(tiSectionID);
    }

网格视图验证错误在不应该被触发的时候被触发

您的正则表达式是坏的。

ValidationExpression="^{1,255}$"

^是字符串的开始,$是字符串的结束。Y}应用于前一个元素。所以这里它会寻找1-255个开始字符串,你可能会考虑使用通配符。所以它将匹配任何字符,只要有1-255个字符。

ValidationExpression="^.{1,255}$"

我将模板拉到一个空页面中,并更改了正则表达式,验证不再触发每个测试。

<asp:TextBox ID="sgvEditName" runat="server" Text=""></asp:TextBox>
<asp:RequiredFieldValidator ID="ReqFieldValEditName" ControlToValidate="sgvEditName" runat="server" 
        ErrorMessage="Required field." ValidationGroup="EditSectionValidation" Display="Dynamic" CssClass="message-error">
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegExpValEditName" ControlToValidate="sgvEditName" runat="server" 
        ErrorMessage="Maximum length is 255." ValidationGroup="EditSectionValidation" ValidationExpression="^.{1,255}$" 
        Display="Dynamic" CssClass="message-error">
</asp:RegularExpressionValidator>
<asp:Button runat="server" ID="btnTest" ValidationGroup="EditSectionValidation" />