C# ASP.NET自定义验证程序未启动

C# ASP.NET自定义验证程序未启动,c#,asp.net,validation,C#,Asp.net,Validation,交易是这样的:我构建了一个自定义验证器,只有在文本框中有输入时才会启动。当它激发时,它应该测试框中的文本是否为整数,如果不是,它将拒绝它。但它不会开火,我正试图找出原因 我把这个空白放在部分c#类的主体中: 验证程序的代码如下所示: <div class="adult"> <label>Adults ($10)</label> <asp:TextBox runat="server" ID="wAdultL

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

我把这个空白放在部分c#类的主体中:

验证程序的代码如下所示:

 <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>

成人(10美元)
如果您有洞察力,我们将不胜感激

编辑:我在下面附上了回发代码

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

如果验证通过,我想您需要执行服务器端事件。 例如:按钮单击事件。 在这种情况下,如果选中Page.IsValid,则验证通过将为false,如果验证通过,则Page.IsValid将为true。
您需要使用Page.IsValid检查验证是否通过。

如果验证通过,我想您需要执行服务器端事件。 例如:按钮单击事件。 在这种情况下,如果选中Page.IsValid,则验证通过将为false,如果验证通过,则Page.IsValid将为true。
您需要使用Page.IsValid检查验证是否通过。

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

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

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

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

您对错误的东西进行了分析
arg.ToString()
将为您提供字符串
“System.Web.UI.WebControls.ServerValidateEventArgs”
,当您实际需要
arg.Value
(它已经是一个字符串)时

所以,不是

bool isNum = int.TryParse(arg.ToString(), out num);
将其更改为(注意
.Value

虽然它比实际需要复杂得多。整个事情可以像这样更全面地重写

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg)
{
    int num;
    arg.IsValid = int.TryParse(are.Value, out num);
}
这是因为如果转换成功,将返回true,否则返回false

最后,所有这些都可以通过
验证程序控件来实现


更新

正如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指出了。。。只有当所有客户端验证都通过时,才会调用此函数。一旦客户端验证失败,将表单提交回服务器的操作也将被取消。

您的解析操作是错误的
arg.ToString()
将为您提供字符串
“System.Web.UI.WebControls.ServerValidateEventArgs”
,当您实际需要
arg.Value
(它已经是一个字符串)时

所以,不是

bool isNum = int.TryParse(arg.ToString(), out num);
将其更改为(注意
.Value

虽然它比实际需要复杂得多。整个事情可以像这样更全面地重写

protected void intValidate_Validate(object sender, ServerValidateEventArgs arg)
{
    int num;
    arg.IsValid = int.TryParse(are.Value, out num);
}
这是因为如果转换成功,将返回true,否则返回false

最后,所有这些都可以通过
验证程序控件来实现


更新

正如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指出了。。。只有当所有客户端验证都通过时,才会调用此函数。一旦客户端验证失败,将表单提交回服务器的操作也将被取消。

我不知道这是否相关,但我遇到了一个问题,自定义验证程序没有启动。我让它验证dropdownlist,它的默认值为空字符串。我必须把它放好

ValidateEmptyString="true" 
然后它就开始正常工作了


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

我不知道它是否相关,但我遇到了一个问题,自定义验证程序没有启动。我让它验证dropdownlist,它的默认值为空字符串。我必须把它放好

ValidateEmptyString="true" 
然后它就开始正常工作了


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

是否可以包含导致回发的对象的标记?您是否在该对象上使用CausesValidation='false'?另外,在继续之前,是否在回发处理程序中检查IsValid?我为按钮添加了回发代码。如何在回发处理程序中检查IsValid,我觉得我还没有这样做。虽然它没有直接回答您的问题,但您是否考虑过使用
?您能否确认“不触发”是否意味着函数未被调用(即,您在函数中放置了断点,并且它从未被命中)。。。或者您的意思是永远不会显示
错误消息
?您有任何客户端验证程序吗?如果他们反对输入,提交将被取消,服务器端验证程序将永远不会运行。您是否可以为导致回发的对象添加标记?您是否在该对象上使用CausesValidation='false'?另外,在继续之前,是否在回发处理程序中检查IsValid?我为按钮添加了回发代码。如何在回发处理程序中检查IsValid,我觉得我还没有这样做。虽然它没有直接回答您的问题,但您是否考虑过使用
?您能否确认“不触发”是否意味着函数未被调用(即,您在函数中放置了断点,并且它从未被命中)。。。或者您的意思是永远不会显示
错误消息
?您有