【问题标题】:asp.net custom validator not firing for textboxasp.net 自定义验证器未触发文本框
【发布时间】:2011-07-04 10:31:35
【问题描述】:

我有用于验证 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;
    }

【问题讨论】:

  • 我总是在使用服务器端验证器时遇到问题,我总是选择客户端:(
  • 我也很想知道这个问题的答案。
  • 方法是否触发了?您是否将其设置为验证器的 OnServerValidate 事件?你能告诉我们验证器的 ASPX 标签吗?
  • 不,根本不触发,标签在那里?
  • @jonezy:小心客户端验证器——它们很容易被欺骗和提交恶意数据。始终确保以一种或另一种方式验证服务器上的输入。

标签: c# asp.net validation customvalidator


【解决方案1】:

检查您是否将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>

.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;
} 

【讨论】:

  • 真的嗯,所以我的代码中的某些东西干扰了事件的触发。我有一堆其他文本框的必填字段验证器,仅此而已。他们都开火了吗??
  • @Eric Savard 您可以做一个简单的测试,然后将您发布的代码复制并粘贴到一个空项目中。它工作正常。您需要找出导致它的原因,所以我会首先注释掉尽可能多的代码并让它工作,然后慢慢添加它以找出导致问题的 sn-p。
  • Kesley,你能把代码发给我吗..因为我用新的网络表单做了你所做的事情,但它仍然不起作用
  • *

  • @EricSavard - 也许我评论太晚了。但是你需要设置 FieldRequired="True" 有时它的行为很奇怪。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,这就是我的原因
  • 旧帖,不过还是感谢您的回复。这回答了我的问题:)
【解决方案3】:

记得在 CustomValidator 上设置这个属性...

ValidateEmptyText="True"

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      我也有这个问题。是的,所有其他验证器都必须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。就我而言,TextBox 必须接受日期和时间!

      所以这里是标记...

      <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();
          }
      }
      

      祝你好运!

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 是的,我听到了,但我只是想确保处理程序不会被击中。
        • @Eric 你试过评论那些Response 行并运行它吗?当我这样做时,它对我来说很好。
        • @Eric:我本以为这也是问题所在。您说该方法没有触发;你有没有在这行之前设置断点并单步验证?
        • 真的啊,根本不适合我。这意味着有其他东西在干扰它
        • 贾斯汀,是的,我确实设置了一个断点,它肯定不会触发
        【解决方案7】:

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

        【讨论】:

        • a CustomValidator 可以在 ValidateEmptyText 属性设置为 true 时触发空文本,正如我在回答中所述。这也应该消除他对RequiredFieldValidator 的要求。
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-13
          • 2010-10-16
          相关资源
          最近更新 更多