0

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

我将这个 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

4 回答 4

2

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

ValidateEmptyString="true" 

然后它开始工作得很好。

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

于 2013-02-03T18:29:20.303 回答
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 已经指出......只有在所有客户端验证都通过时才会调用它。一旦客户端验证失败,将表单提交回服务器也会被取消。

于 2012-08-01T13:24:52.073 回答
0

我想如果验证通过,你有一个服务器端事件要执行。例如:按钮单击事件。如果您检查 Page.IsValid 则如果验证通过则它将为假,那么 Page.IsValid 将为真。您需要使用 Page.IsValid 来检查验证是否通过。

于 2012-07-31T21:00:29.710 回答
0

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

<asp:Button ID="btnSubmit" Text="Submit" CausesValidation="true" runat="server" />
于 2012-07-31T21:45:55.843 回答