C# asp.net自定义验证程序未为textbox启动

C# asp.net自定义验证程序未为textbox启动,c#,asp.net,validation,customvalidator,C#,Asp.net,Validation,Customvalidator,我有一个必需的字段验证器和自定义验证器来验证texbox。所需的字段验证器将完全启动。我无法让自定义验证器正常启动 <asp:TextBox ID="txtPRI" runat="server" Width="295" /><br /> <asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true" runat="server" controlto

我有一个必需的字段验证器和自定义验证器来验证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!" />

问题是您正在调用它,它实际上停止了页面的所有执行。因此,if/else块根本没有运行。在调试过程中注释该行或跳过该行,验证程序将按预期启动


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

据我所知,如果文本框为空,自定义验证器将不会启动。

请检查您的
CustomValidator
属性
ValidateEmptyText
是否设置为
true
,以便验证空文本。这样您就不再需要
RequiredFieldValidator

编辑:我将您的代码复制并粘贴到一个空项目中,它按预期工作。一定有一些东西你没有发布,或发布错误,我们不知道。是否有任何其他因素影响触发验证的按钮或验证控件本身

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

aspx页面:

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

好的。。。这是一个很老的问题,还没有被接受的答案,我也遇到了同样的问题

所以我要把它扔给其他可能有这个问题并需要答案的人


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

除了上面的建议之外,我发现在.Net framework的较新版本中,您必须显式启动验证()方法来获取自定义验证器例程

    // validate page before allowing import to go through
    Page.Validate();
    if (!Page.IsValid)
        return;

请记住在CustomValidator上设置此属性

ValidateEmptyText="True"

我也有这个问题。是的,所有其他验证器都必须通过才能启动
CustomValidator

但是,如果这对您不起作用,则您可能需要使用
页面.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>
您还需要服务器端验证
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>


祝您好运!

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

我总是遇到服务器端验证器的问题,我总是使用客户端:(我也想知道这个问题的答案。该方法是否会触发?您是否将其设置为验证器的OnServerValidate事件?您能否向我们展示验证器的ASPX标记?不,根本不会触发,标记就在那里?@jonezy:小心客户端验证器-它们很容易欺骗和提交恶意数据。始终确保您进行验证在服务器上输入,以这种或那种方式。是的,我听到了,但我只是试图确保处理程序被击中,而不是被击中。@Eric你有没有试过注释那些
响应
行并运行它?这样做对我来说很好。@Eric:我也会认为这是个问题。你说这个方法没有触发;是吗你在这一行之前设置了一个断点并进行了验证?真的吗,对我来说根本不起作用..这意味着有其他东西在干扰它Justin,是的,我设置了一个断点,它肯定不会触发
CustomValidator
如果
ValidateEmptyText
属性设置为
true
则可以触发空文本>正如我在回答中所说的那样。这应该也消除了他对
RequiredFieldValidator
的要求。真的,呃,所以我的代码中有一些东西干扰了事件的触发。我有一堆其他文本框所需的字段验证器,仅此而已。它们都能正常启动???@Eric Savard你可以做一个简单的测试,j只需将您发布的代码复制并粘贴到一个空项目中。它可以正常工作。您需要分离出导致它的原因,这样我就可以从注释尽可能多的代码开始,并使其正常工作,然后缓慢地将其添加回,以找出是哪个代码段导致了问题。凯斯利,您能将代码发送给我吗..因为我所做的正是您所做的用一个新的网络表单做了,但仍然不起作用*
@EricSavard-也许我评论得太晚了。但你需要设置FieldRequired=“True”,有时它会表现得很奇怪。谢谢你,这就是我发表这篇文章的原因,但无论如何,谢谢你的回复。这回答了我的问题:)
<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>
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();
        }
    }
<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();
    }
}