如果控件尚未填充,则自定义验证器不会触发

Custom Validator not firing if control has not been filled in

本文关键字:验证 自定义 控件 填充 如果      更新时间:2023-09-26

我有一种感觉,这可能是一个非常简单的问题,但我这辈子也弄不清楚。

我有一个asp:文本框。我有一个自定义验证器,其中有客户端和服务器端验证。

代码如下:

<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验证不会触发。如果我输入一些东西。把盒子留下。返回并清除验证有效的方框。返回结果为空

但是,我想让它在他们进入框中并让它执行验证。我不确定为什么验证器不触发,如果文本框已被触及。

把脚本放在你的web表单的任何地方,它会按照你想要的方式工作:

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

Validator不按你想要的方式工作,因为它将一个onchange事件处理程序附加到TextBoxes上,所以,如果你根本不改变文本,你就不会得到验证。

但是如果你强迫所有的文本框触发相同的事件onblur,然后,如果你已经改变了文本与否,它将触发验证,这就是上面的脚本正在做的:添加事件处理程序到页面中的所有文本框,并调用ValidatorOnChange函数时,它发生。

注意:如果你已经有了一个脚本被调用到你的应用程序中的每个WebForm,你希望这种行为在任何地方工作,你可以添加代码到该脚本(在它的任何地方),并解决方案将传播到所有的WebForm。

我相信CustomValidators的设计目的是与RequiredFieldValidators分开操作,并且它们不触发空字段是正常的。

我已经测试了这段代码,使用随机客户端验证,验证没有正确启动。

我已经添加了无障碍元素:

  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被加载了

啊,asp.net webforms的乐趣:)

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

或者你可以在web中关闭不显眼的验证。配置并查看当它为空时是否会触发。

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

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

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

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

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

你必须调用

if (Page.IsValid)

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

对于客户端验证,你必须编写一个JavaScript方法来做同样的事情。您可以在CustomValidator中设置属性:

ClientValidationFunction = " YourValidationMethod "

方法会做类似这样的事情

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