仅在单击页面上的多个按钮之一时运行 ASP.Net 自定义验证器

Sun*_*nil 0 asp.net customvalidator

我的 ASP.Net (4.0) 页面中有以下代码,其中有 2 个按钮 - 'Button1' 和 'Button2'、一个文本框、一个必填字段验证器和一个自定义验证器。

我希望自定义验证器仅在单击“Button1”时触发,而不是在单击“Button2”时触发,Button2 仍需要评估所需的字段验证器。我将如何做到这一点?

   Input 1:
 <asp:TextBox id="txtCustomData" runat="server"   />
  <asp:CustomValidator id="CustomValidator1"   
      runat="server" ErrorMessage="Number not divisible by 2!"
      ControlToValidate="txtCustomData" 
      ClientValidationFunction="CheckEven"  />
 <br/>
 Input 2:
 <asp:TextBox id="TextBox2" runat="server"    />
    <asp:RequiredFieldValidator ID="rfv1" runat="server" ControlToValidate="TextBox2" 
           ErrorMessage="* Required" ForeColor="Red" > 
     </asp:RequiredFieldValidator>
    <br/>
   <br/>
    <asp:Button id="btn1" runat="server" Text="Button1" />
   <br/>
   <asp:Button id="btn2" runat="server" Text="Button2" />

 <script language="javascript">
<!--
function CheckEven(source, args) {
    var val = parseInt(args.Value, 10);
    if (isNaN(val)) {
        args.IsValid = false;
    }
    else {
        args.IsValid = ((val % 2) == 0);
    }
}
// -->
</script>
Run Code Online (Sandbox Code Playgroud)

更新 1: 虽然 Rick 的回答是一个可能的答案,但我找到了另一种处理这种情况的方法。

当两个按钮都需要验证 2 个不同的验证器并且其中一个验证器是自定义验证器时,我可以使用验证组。为需要评估自定义验证器的 Button1 设置 ValidationGroup="Group1",为需要评估所需字段验证器的 Button2 设置 ValidationGroup="Group2",并为相应的验证器包含相同的值。不需要为文本框包含 ValidationGroup。

   Input 1:
 <asp:TextBox id="txtCustomData" runat="server"   />
  <asp:CustomValidator id="CustomValidator1"   
      runat="server" ErrorMessage="Number not divisible by 2!"
      ControlToValidate="txtCustomData" 
      ClientValidationFunction="CheckEven"  />
 <br/>
 Input 2:
 <asp:TextBox id="TextBox2" runat="server"    />
    <asp:RequiredFieldValidator ID="rfv1" runat="server" ControlToValidate="TextBox2" 
           ErrorMessage="* Required" ForeColor="Red" ValidationGroup="Group2"> 
     </asp:RequiredFieldValidator>
    <br/>
   <br/>
    <asp:Button id="btn1" runat="server" Text="Button1" ValidationGroup="Group1"/>
   <br/>
   <asp:Button id="btn2" runat="server" Text="Button2" ValidationGroup="Group2"/>

 <script language="javascript">
<!--
function CheckEven(source, args) {
    var val = parseInt(args.Value, 10);
    if (isNaN(val)) {
        args.IsValid = false;
    }
    else {
        args.IsValid = ((val % 2) == 0);
    }
}
// -->
</script>
Run Code Online (Sandbox Code Playgroud)

更新 2: 如果您最终在按钮的 OnClientClick 事件中使用自定义 javascript,那么您需要小心使用 javascript,否则即使数据有效,您的按钮也可能永远不会回发。

例如,如果您编写了一个名为“ValidateData()”的自定义 javascript 函数,则首先确保它始终在其中包含 return true 或 return false 语句,然后您的 OnClientClick 应以如下所示的方式使用此函数。大多数开发人员将简单地使用 OnClientClick = "return ValidateData();" 这将使 ASP.Net 按钮永远不会执行 ASP.Net 回发,即使数据被评估为有效,因为 ASP.Net 中的默认 __doPostBack JavaScript 函数永远不会被调用(假设此按钮的 UseSubmitBehavior="false" ,如果 UseSubmitBehavior="true" 则不使用 __doPostBack 并且按钮将回发)。

   <asp:Button id="btn1" runat="server" Text ="Button1" 
        OnClientClick="var r = ValidateData(); if (!r) { return false; } " />
  <script type=<script type="text/javascript">
  function ValidateData( )
     {
       var x = document.getElementById('xy1');
        if(x.value == '1')
         {
           return false;
         }

        return true;
      }
    </script>
Run Code Online (Sandbox Code Playgroud)

Ric*_*k S 5

包括该CausesValidation属性并将其设置为 False。您的按钮不会触发验证。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation(v=vs.110).aspx

<asp:Button id="btn2" runat="server" Text="Button2" CausesValidation="False"/>
Run Code Online (Sandbox Code Playgroud)