You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在按键(如回车)时触发<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:25:09