【问题标题】:Custom Validator not firing if control has not been filled in如果尚未填写控件,则自定义验证器不会触发
【发布时间】:2015-12-13 00:26:26
【问题描述】:

我有一种感觉,这可能是一个非常简单的问题,但我一生都无法弄清楚。

我有一个 asp:textbox。我有一个自定义验证器,它具有客户端和服务器端验证。

代码如下:

<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox>

<asp:CustomValidator ID="vldFirstName" runat="server" ControlToValidate="txtFirstName"
    ClientValidationFunction="ValidateName" OnServerValidate="vldFirstName_ServerValidate"
    Text="Please put in your first name" ErrorMessage="First name missing"
    ForeColor="Red" font-bold="true" Display="Dynamic"
    ValidateEmptyText="true">
</asp:CustomValidator>

如果我直接进入我的页面并单击提交,这将在服务器端正确验证,将文本框留空。

但是通过客户端验证。如果我进入盒子并直接从盒子里出来而不输入任何东西。 javascript 验证不会触发。如果我再输入一些东西。留下这个框。返回并清除验证有效的框。它回来说它是空的。

但是我希望他们一进入盒子就让它进行验证。如果文本框未被触及,我不确定为什么验证器不会触发。

【问题讨论】:

  • 查看ValidateName 代码可能会有所帮助。
  • @stuartd,验证代码现在很简单,检查长度是否大于 3 并且值不为空。每次调用客户端代码时,我都对其进行了调试并放置了一个断点。当我放入一些东西然后删除它时工作正常。但是如果它刚刚被跳过会触发
  • ValidateName 表示跳过和放置/删除时输入值是什么?
  • 验证函数是否在ValidateName(sender, args)上定义了正确的函数参数?是否需要更改 UnobtrusiveValidationMode 的应用设置?
  • @Sam 我已经测试了您的代码,在我的测试应用程序中一切正常。如果您可以与我们分享 validateName 代码会更好,可能该代码或任何其他相关控件有问题导致此问题。

标签: javascript c# asp.net validation


【解决方案1】:

我已经使用随机客户端验证测试了该代码,但验证没有正确触发。

我已经添加了通畅的元素:

  1. 页面加载时:(或者你想激活它)

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms;
    }
    
  2. 确保已加载 jquery:

在 global.asax 上:

 protected void Application_Start(object sender, EventArgs e)
        {
            ScriptManager.ScriptResourceMapping.AddDefinition("jquery",
            new ScriptResourceDefinition
        {
          Path = "~/scripts/jquery-2.1.4.min.js",
          DebugPath = "~/scripts/jquery-2.1.4.js",
          CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.min.js",
          CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.js"
        });
        }

这两个更新后(我有一个提交 btn)它运行良好。

所以,请检查您是否加载了无障碍验证以及您的 jquery 是否已加载。

【讨论】:

    【解决方案2】:

    你必须打电话

    如果 (Page.IsValid)

    在服务器上回发,否则将不会调用您的服务器验证。 RequiredFieldValidator 在客户端上进行验证,这就是这个工作的原因。但是,您也应该始终在服务器上进行验证。

    对于客户端验证,您必须编写一个执行相同操作的 JavaScript 方法。您在 CustomValidator 中设置属性:

    ClientValidationFunction="YourValidationMethod"

    这个方法会做这样的事情

    function YourValidationMethod(source, args)
    {
    
       if (valid) // do check here
         args.IsValid = true;
      else
         args.IsValid = false;
    }
    

    【讨论】:

    • 如果我回发,服务器端可以正常工作。如果文本框根本没有任何内容,则客户端不会触发
    【解决方案3】:

    我相信 CustomValidators 在设计上旨在与 RequiredFieldValidators 分开运行,它们不会在空字段上触发是正常的。

    【讨论】:

    • 是的,默认情况下它不会在空字段上触发,但如果您将 ValidateEmptyText 指定为 true,那么它应该每次都触发
    【解决方案4】:

    啊,asp.net 网络表单的乐趣 :)

    如果您正在使用其他控件,例如带有自己的 jquery 版本的 radControls,这可能是一个问题,请确保通过禁用它们来使用框架附带的控件。

    或者,您可以在 web.config 中关闭不显眼的验证,看看它是否会在它为空时触发。

     <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>
    

    【讨论】:

    • 使用框架版本。试过这个,没有什么不同。创建了一个新项目。添加了一个带有自定义验证器的文本框,但它不会触发,除非输入了某些内容然后失去焦点,然后我可以删除文本,它会正确触发
    【解决方案5】:

    根据 msdn 文档...我对 validateEmptyText = true 属性的理解是,即使文本框为空,它也会触发自定义验证(validateName javascipt 函数)。

    可能在第一次加载时该文本框的值未定义,但是当您编辑和撤消它时,文本框的值现在将为空。(不是未定义)这就是为什么它在您编辑和撤消时触发但不是在第一次加载时触发。

    一种方法是在表单的加载事件中使用空字符串初始化文本框值

    但我认为您可以通过使用必填字段验证器和自定义验证器来解决您的问题,这是更好的方法。

    【讨论】:

    • 不,还是一样。尝试添加必填字段验证器,并尝试在 Page_Load 中将值设置为 String.Empty; 仍然相同。除非先输入内容,否则不会验证
    【解决方案6】:

    将下面的脚本放在您的网络表单中的任何位置,它就会按照您想要的方式运行:

    document.addEventListener('DOMContentLoaded', function() {
      [].forEach.call(document.querySelectorAll('input'), function(el, i) {
        el.addEventListener('blur', ValidatorOnChange);
      });
    });
    

    验证器本身并不能按照您想要的方式工作,因为它会将onchange 事件处理程序附加到文本框,因此,如果您根本不更改文本,则不会获得验证。

    但是如果你强制所有的TextBoxes触发相同的事件onblur,那么无论你是否改变了文本,它都会触发验证,这就是上面的脚本正在做的事情:添加那个事件处理程序到页面中的所有TextBoxes,并在发生时调用ValidatorOnChange函数。

    注意:如果您已经在应用程序中的每个 WebForm 中调用了任何脚本,并且您希望此行为在任何地方都有效,您可以将代码添加到该脚本(其中的任何位置),解决方案将传播到您的所有网络表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多