29

我有用于验证 texbox 的必填字段验证器和自定义验证器。必填字段验证器完美触发。我无法让自定义验证器正确触发?

<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />

<asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />

 <asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  errormessage="The text must be exactly 8 characters long!" />

后面的代码

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
    {
        Response.Write("firing - test");
        Response.End();


        if (e.Value.Length == 8)
            e.IsValid = true;
        else
            e.IsValid = false;
    }
4

8 回答 8

52

检查您是否将CustomValidator属性ValidateEmptyText设置为true以便验证空文本。然后你就不再需要RequiredFieldValidator了。

编辑:我把你的代码复制并粘贴到一个空项目中,它按预期工作。一定有一些您没有发布或发布不正确的内容,我们不知道。还有什么会影响触发验证的按钮或验证控件本身吗?

编辑:这是确切的代码(在内容页面中):

页面:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />  
    <asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  errormessage="The text must be exactly 8 characters long!" /> 
</asp:Content>

.cs 页面(空Page_Load):

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{ 
    // put a break point here and it stops on it
    if (e.Value.Length == 8)
        e.IsValid = true;
    else
        e.IsValid = false;
} 
于 2011-02-25T17:04:19.410 回答
18

好的......非常老的问题还没有被接受的答案,我刚刚遇到了同样的问题。

因此,我将把它扔给其他可能遇到此问题并需要答案的人...

如果您正在执行常规验证以及自定义服务器验证,那么只有在所有其他验证都恢复正常时才会触发自定义服务器验证,至少,这对我来说是这样的。

于 2012-03-02T03:59:19.767 回答
9

请记住在 CustomValidator 上设置此属性...

ValidateEmptyText="True"
于 2013-07-17T09:08:01.260 回答
5

除了上述建议之外,我发现对于较新版本的 .Net 框架,您必须在服务器上显式触发 validate() 方法才能获取自定义验证器例程

    // validate page before allowing import to go through
    Page.Validate();
    if (!Page.IsValid)
        return;
于 2013-04-22T15:34:11.810 回答
3

我也有这个问题。是的,所有其他验证者都必须在火灾发生前通过。CustomValidator

但是,如果这对您不起作用,那么您可能需要使用Page.Validate().

我就是这样做的,我仍然设法保留我的RequiredFieldValidator并且不需要ValidateEmptyText="true".

在文本框中添加一个陷阱以强制验证。

<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>

请注意,我使用的是特定的ValidationGroup“vg2”,因为我还有其他不想验证的区域。

另外,我想验证日期和时间

你还需要两件事。方法TextBoxChanged_DateTimeTest...

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
    {
        Page.Validate("vg2");
        if (!Page.IsValid)
        {
            TextBox tb1 = (TextBox)sender;
            IFormatProvider culture = new CultureInfo("en-AU", true);

            //if page is not valid, then validate the date here and default it to today's date & time, 
            String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
            DateTime dt1;
            DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
            if (dt1.ToShortDateString() != "1/01/0001")
                tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
            else
                tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
        }
    }

而且您还需要服务器端验证CustomValidator. 在我的情况下,文本框必须接受日期和时间!

所以这里是标记...

<asp:CustomValidator ID="CustomValidator3" runat="server" ControlToValidate="txtLeft" ErrorMessage="Invalid date & time format (dd/MM/yyyy HH:mm)" 
                                    SetFocusOnError="true" ValidationGroup="vg2" OnServerValidate="CustomValidator_DateTime"></asp:CustomValidator>

这是背后的代码......

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
    Page.Validate("vg2");
    if (!Page.IsValid)
    {
        TextBox tb1 = (TextBox)sender;
        IFormatProvider culture = new CultureInfo("en-AU", true);

        //if page is not valid, then validate the date here and default it to today's date & time, 
        String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
        DateTime dt1;
        DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
        if (dt1.ToShortDateString() != "1/01/0001")
            tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
        else
            tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
    }
}

祝你好运!

于 2016-02-18T00:58:03.660 回答
1

据我记得,如果您的文本框为空,自定义验证器将不会触发。

于 2011-02-25T16:59:44.170 回答
1

问题是您正在调用Response.End()它有效地停止了页面的所有执行。因此,if/else 块根本没有运行。在调试时注释掉该行或跳过它,验证器将按预期触发。

我建议您使用调试器而不是以这种方式写出响应,或者注意Response.End()如果您选择使用它的后果。

于 2011-02-25T16:55:09.630 回答
0

如果您的代码中有多个部分并且每个部分都有一些验证器,请为每个部分创建 validateGroup

于 2019-07-14T06:56:35.983 回答