如何仅在按键(如回车)时触发<asp:CustomValidator>的OnServerValidate事件?
解决方案
1. 用ValidationGroup隔离验证范围
给asp:CustomValidator和目标dx:ASPxTextBox指定同一个验证组,仅让需要触发该验证的控件(如特定提交按钮)归属此组,其他控件不使用该组:
<asp:CustomValidator ValidateEmptyText="true" ClientValidationFunction="test" OnServerValidate="Unnamed_ServerValidate" ControlToValidate="Ndit1" runat="server" ValidationGroup="NditValidationGroup" <!-- 添加验证组 --> /> <dx:ASPxTextBox Caption=" " MaxLength="4" ClientInstanceName="Ndit1" ID="Ndit1" runat="server" CssClass="mb-1" Width="100%" Visible="false" BackColor="Aqua" ValidationGroup="NditValidationGroup" <!-- 添加验证组 --> > <CaptionSettings ShowColon="false" /> <CaptionCellStyle Width="140px"></CaptionCellStyle> </dx:ASPxTextBox> <!-- 仅需触发验证的按钮归属同一组 --> <asp:Button ID="BtnSubmitNdit" runat="server" Text="提交" ValidationGroup="NditValidationGroup" />
这样只有同组控件触发提交时,才会执行该CustomValidator的验证,其他按钮、文本框的提交操作不会触发它。
2. 阻止其他文本框的回车默认提交
给不需要触发页面提交的文本框添加客户端事件,屏蔽回车的默认提交行为:
- 普通ASP.NET文本框:
<asp:TextBox ID="OtherTextBox" runat="server" onkeydown="if(event.keyCode===13){event.preventDefault();return false;}" />
- DevExpress的ASPxTextBox:
<dx:ASPxTextBox ID="OtherDxTextBox" runat="server"> <ClientSideEvents KeyDown="function(s,e){if(e.htmlEvent.keyCode===13){e.htmlEvent.preventDefault();}}" /> </dx:ASPxTextBox>
3. 服务器端验证增加触发条件判断
在Unnamed_ServerValidate方法中,判断提交是否由目标控件触发,再执行验证逻辑:
protected void Unnamed_ServerValidate(object source, ServerValidateEventArgs args) { string triggerId = Request.Params.Get("__EVENTTARGET"); // 仅当目标按钮或Ndit1触发提交时,执行验证 if (triggerId == "BtnSubmitNdit" || triggerId == "Ndit1") { // 替换为你的实际验证逻辑 args.IsValid = !string.IsNullOrEmpty(args.Value) && args.Value.Length == 4; } else { // 非目标触发,直接跳过验证 args.IsValid = true; } }
4. 手动触发验证(仅Ndit1回车时生效)
禁用CustomValidator的自动触发,监听Ndit1的回车事件,手动触发验证并提交:
<asp:CustomValidator ValidateEmptyText="true" ClientValidationFunction="test" OnServerValidate="Unnamed_ServerValidate" ControlToValidate="Ndit1" runat="server" EnableClientScript="true" ValidationGroup="NditValidationGroup" /> <dx:ASPxTextBox Caption=" " MaxLength="4" ClientInstanceName="Ndit1" ID="Ndit1" runat="server" CssClass="mb-1" Width="100%" Visible="false" BackColor="Aqua" > <CaptionSettings ShowColon="false" /> <CaptionCellStyle Width="140px"></CaptionCellStyle> <ClientSideEvents KeyDown="function(s,e){ if(e.htmlEvent.keyCode===13){ // 手动触发客户端验证,通过后提交 if(Page_ClientValidate('NditValidationGroup')){ __doPostBack('Ndit1', ''); } } }" /> </dx:ASPxTextBox>
内容的提问来源于stack exchange,提问作者Software Memo
相关产品推荐
相关产品推荐

