2012-07-31 46 views
0

这里的处理:我构建了一个自定义验证器,只应在文本框中输入时触发。当它触发时,它应测试以查看框中的文本是否为整数,否则将拒绝它。它不会开火,但我试图找出原因。ASP.NET自定义验证器没有触发

我把这个空白的部分C#类的主体:

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
    { 
     int num; 
     bool isNum = int.TryParse(arg.ToString(), out num); 

     if(arg.Value.Length>0){ 
      if (isNum) 
      { 
       arg.IsValid = true; 
      } 
      else 
      { 
       arg.IsValid = false; 
      } 
     } 
     else{ 
      arg.IsValid=true; 
     } 
    } 

验证器的代码如下:

<div class="adult"> 
      <label>Adults ($10)</label> 
      <asp:TextBox runat="server" ID="wAdultLunch" class="adultLunch" MaxLength="2" /> 
      <asp:CustomValidator ID="intValidate" ControlToValidate="wAdultLunch" ErrorMessage="Invalid number" OnServerValidate="intValidate_Validate" Display="Static" runat="server" EnableClientScript="False" ValidateEmptyText="True"></asp:CustomValidator> 
</div> 

洞察力,将不胜感激!

编辑:我在下面附

<asp:Button ID="wSubmit" runat="server" Text="Submit" OnClientClick="return validateForm();" causesvalidation="true"/> 
+0

您可以包含引起回发的对象的标记吗?您在该对象上使用CausesValidation ='false'吗?另外,在继续之前,你是否在你的回发处理程序中检查IsValid? – 2012-07-31 21:45:07

+0

我添加了该按钮的回发代码。我如何检查回发处理程序中的IsValid,我觉得我没有这样做。 – ijb109 2012-08-01 13:04:11

+0

尽管它没有直接回答你的问题,你有没有考虑过使用''和'? – freefaller 2012-08-01 13:10:19

回答

2

您正在对错误的东西进行解析。 arg.ToString()会给你的"System.Web.UI.WebControls.ServerValidateEventArgs",字符串当你真正想要的arg.Value(这已经是一个字符串)

所以,与其...

bool isNum = int.TryParse(arg.ToString(), out num); 

其更改为(注意.Value)。 ...

bool isNum = int.TryParse(arg.Value, out num); 

虽然它比实际需要复杂得多。整个事情可以更全面地改写了很多这样的...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
{ 
    int num; 
    arg.IsValid = int.TryParse(are.Value, out num); 
} 

这是因为TryParse将返回true,如果转换成功,否则为false。

作为最后的想法,所有这些都可以使用<asp:RequiredFieldValidator ...>,<asp:CompareValidator Operator="DataTypeCheck" Type="Integer" ...><asp:RangeValidator ...>验证器控件来实现。


UPDATE

由于OP指出,他不希望错误时的文本框为空时,这样反而试试这个...

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg) 
{ 
    if (args.Value.Length > 0) 
    { 
     int num; 
     arg.IsValid = int.TryParse(are.Value, out num); 
    } 
    else 
    { 
     arg.IsValid = true; 
    } 
} 

而且具有已经被@HansKesting指出......如果所有的客户端验证都通过了,这将只会被调用。只要客户端验证失败,表单提交回服务器也会被取消。

+0

这很有帮助。我试图获得参数长度的部分原因是,如果没有值传入,我希望它是有效的,但如果有参数,则它需要是一个数字。 – ijb109 2012-08-01 14:06:48

+0

啊,ok @ ijb109 - 这很有道理......在这种情况下,将解析**放在** if(args.Value.Length> 0)中''不要在空字符串上执行它 – freefaller 2012-08-01 14:09:07

+0

只为了确定,这只会在提交按钮被点击时激活,是否正确?在这种情况下,然后,客户端验证会使其无法验证,因此为了测试它,我必须将其关闭。 – ijb109 2012-08-01 14:30:41

0

回传代码,我假设你有一个服务器端的事件,如果验证通过执行。例如: :按钮点击事件。 因为如果您检查Page.IsValid,那么如果验证通过,则Page.IsValid将为true将为false。 您需要使用Page.IsValid来检查验证是否通过。

0

在前端尝试将CausesValidation属性设置为true,如下所示。看看是否有帮助。

<asp:Button ID="btnSubmit" Text="Submit" CausesValidation="true" runat="server" /> 
2

我不知道它是否相关,但我有一个自定义验证器没有解雇的问题。我让它验证了一个dropdownlist,它有一个空字符串的默认值。我必须设置

ValidateEmptyString="true" 

然后它开始工作就好了。

您也可以调用Validate()函数并从自定义验证器控件读取IsValid属性。但是,页面的验证功能应该可以正常工作,并且不应该需要这样的调用。