ASP.NET自定义验证程序未激活

时间:2012-07-31 20:55:31

标签: c# asp.net validation

这是交易:我构建了一个自定义验证器,只有在文本框中有输入时才会触发。当它触发时,它应该测试以查看框中的文本是否为整数,如果不是则它将拒绝它。但它不会发射,而我正在试图找出原因。

我将此void放在部分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"/>

4 个答案:

答案 0 :(得分: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 ...>验证器控件可以实现所有这些。


<强>更新

正如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已经指出了......只有在传递所有客户端验证时才会调用它。一旦客户端验证失败,表单提交回服务器也会被取消。

答案 1 :(得分:2)

我不知道它是否相关,但我遇到了自定义验证器未触发的问题。我让它验证了一个下拉列表,它的默认值为空字符串。我不得不设置

ValidateEmptyString="true" 

然后它开始正常工作。

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

答案 2 :(得分:0)

我认为如果验证通过,您将执行服务器端事件。 例如:按钮点击事件。 如果您检查Page.IsValid,那么如果验证通过则它将为false,然后Page.IsValid将为true。 您需要使用Page.IsValid来检查验证是否通过。

答案 3 :(得分:0)

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

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