我在内容页面中有一个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>
答案 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搞砸了。
或者,将按钮保留在页脚中,但将LinkButton服务器控件转换为基本的html <button>
控件,并将onclick
属性设置为上面的某个验证函数,并调用{{1成功的客户端验证。始终检查服务器端的输入以及安全措施。
有关ASP客户端验证API的更完整概念,请查看已发布项目的__doPostBack('SomeEventTargetName', 'SomeEventTargetArgument')
的obj目录。
WebUIValidation.js