验证器不会阻止回发

时间:2016-04-11 14:09:04

标签: c# asp.net validation gridview

我在内容页面中有一个GridView。在GridView中,我可以执行删除和插入。对于插入,我需要确保StudentNo和Amount的输入不能为空。所以我使用了RequiredFieldValidator。问题是,当我单击插入时,它仍然回发,即使这两个文本框是空的。在我的服务器端函数中,GridView_RowCommand我总是要检查if(Page.IsValid)。我的问题是为什么即使验证失败,RFV也不会停在客户端。以下是我的aspx代码,任何人都可以帮我看看我错过了什么吗?

<asp:Content ID="Content3" ContentPlaceHolderID="ContentMain" Runat="Server">
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" 
        ShowFooter="true" AllowPaging="True" PageSize="40" AllowSorting="True" 
        DataKeyNames="ID" onrowcommand="GridView1_RowCommand">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="lbDelete" CommandArgument='<%# Eval("ID") %>' CommandName="DeleteRow" runat="server" 
                CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this row?')" 
                Font-Underline="True" Font-Bold="True">Delete</asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ID" SortExpression="">
            <ItemTemplate>
                <asp:Label ID="Label_ID" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:LinkButton ID="lbInsert" CommandName="InsertRow" ValidationGroup="Insert" runat="server" 
                Font-Underline="True" Font-Bold="True" CausesValidation="true">Insert</asp:LinkButton>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="InstCode" SortExpression="">
            <ItemTemplate>
                <asp:Label ID="Label_InstCode" runat="server" Text='<%# Bind("InstCode") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="StudentNo" SortExpression="">
            <ItemTemplate>
                <asp:Label ID="Label_StudentNo" runat="server" Text='<%# Bind("StudentNo") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="txtStudentNo" runat="server"></asp:TextBox>
                <asp:RequiredFieldValidator ID="rfvStudentNo" runat="server" ErrorMessage="StudentNo is a required field" 
                    ControlToValidate="txtStudentNo" Text="*" ForeColor="Red" ValidationGroup="Insert">
                </asp:RequiredFieldValidator>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="AccountType" SortExpression="">
            <ItemTemplate>
                <asp:Label ID="Label_AccountType" runat="server" Text='<%# Bind("AccountType") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Amount" SortExpression="">
            <ItemTemplate>
                <asp:Label ID="Label_Amount" runat="server" Text='<%# Bind("Amount") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:TextBox ID="txtAmount" runat="server"></asp:TextBox>
                <asp:RequiredFieldValidator ID="rfvAmount" runat="server" ErrorMessage="Amount is a required field" 
                    ControlToValidate="txtAmount" Text="*" ForeColor="Red" ValidationGroup="Insert">
                </asp:RequiredFieldValidator>
        </FooterTemplate>
        </asp:TemplateField>
    </Columns>
    </asp:GridView>
    <asp:ValidationSummary ID="ValidationSummary1" ValidationGroup="Insert" ForeColor="Red" runat="server" />
    <br /><br />
    <asp:Label ID="lblMessage" runat="server" Text="" ForeColor="Red"></asp:Label>
</asp:Content>

1 个答案:

答案 0 :(得分:0)

我正在移动我的评论,因为还有更多想法

GridView中的验证,尤其是当您绕过GridView的编辑模式时,会因事件冒泡而导致回发。

服务器控制Click事件冒泡Gridview并触发可在GridView RowCommand事件中截获的回发。您需要截取点击并拨打event.stopPropagation()set event.cancelBubble = true,具体取决于您的浏览器:

void some_js_onclick_function_called_within_a_gridview( event ) {
  if ( event.stopPropagation )
    event.stopPropagation();
  else
    event.cancelBubble = true;
}

但是你必须应对验证,这很容易,因为ASP.NET有一个用于验证的客户端API:ASP.NET Validation in Depth

最简单的答案是从GridView页脚中删除输入字段,牺牲“外观和感觉”来处理验证,而不会让Gridview搞砸了。

或者,将按钮保留在页脚中,但将LinkBut​​ton服务器控件转换为基本的html <button>控件,并将onclick属性设置为上面的某个验证函数,并调用{{1成功的客户端验证。始终检查服务器端的输入以及安全措施。

有关ASP客户端验证API的更完整概念,请查看已发布项目的__doPostBack('SomeEventTargetName', 'SomeEventTargetArgument')的obj目录。

WebUIValidation.js