如果控件没有填写,自定义验证器不会触发。

12

我觉得这可能是一个非常简单的问题,但是我怎么也想不出来。

我有一个 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验证不起作用。 如果我随后输入内容,离开框,然后清除框,则验证有效。 它会返回说它是空的。

但是,我希望他们一进入框就立即进行验证。 我不确定为什么如果文本框没有被触摸,则验证器不会启动。


2
看看ValidateName的代码可能会有所帮助。 - stuartd
验证函数是否在“ValidateName”(sender,args)上定义了正确的函数参数?您需要更改UnobstrusiveValidationMode的appsetting吗? - Jono_2007
@Sam,我已经测试了你的代码,在我的测试应用中一切正常。如果你能与我们分享validateName代码,可能是该代码或任何其他相关控件导致了这个问题,那就更好了。 - BASEER HAIDER JAFRI
@Sam...请更新您的问题,展示基于服务器的事件处理程序vldFirstName_ServerValidate代码和ValidateName - Salah Akbari
大家好。给我代码是没有意义的,因为当文本框为空时,它不会触发事件。如果我在新页面中点击文本框,然后不输入任何内容就点击或切换到其他地方,事件不会触发。但是如果我输入一些内容,然后点击或切换到其他地方,事件就会触发。然后,如果我清空文本框,然后再次点击或切换到其他地方,事件又会触发。所以问题在于当文本框为空时的起始点击。 - Sam
显示剩余5条评论
6个回答

4
将以下脚本放置在您的网络表单中的任何位置,它将按照您想要的方式工作:
document.addEventListener('DOMContentLoaded', function() {
  [].forEach.call(document.querySelectorAll('input'), function(el, i) {
    el.addEventListener('blur', ValidatorOnChange);
  });
});

验证程序无法以您想要的方式自然工作,因为它会将一个onchange事件处理程序附加到文本框上,所以如果您根本没有更改文本,则不会进行验证。
但是,如果您强制所有文本框触发相同的onblur事件,则无论您是否更改了文本,都将触发验证,这就是上面的脚本所做的:向页面中的所有文本框添加该事件处理程序,并在其发生时调用ValidatorOnChange函数。
注意:如果您已经有任何脚本被调用到您应用程序中的每个WebForm中,并且您希望此行为在所有地方起作用,则可以将代码添加到该脚本中(任何位置),解决方案将传播到所有WebForms。

3

我认为CustomValidators的设计目的是与RequiredFieldValidators分开处理,因此它们不会在空字段上触发是很正常的。


2
是的,默认情况下它不会在空字段上触发,但如果您将ValidateEmptyText设置为true,则它应该每次都会触发。 - Viru

2
根据 MSDN 文档所述,我理解 validateEmptyText = true 属性的作用是即使文本框为空,也会触发自定义验证(validateName JavaScript 函数)。
可能在第一次加载时,该文本框的值为未定义,但是当您编辑并撤消它时,文本框的值现在为空(而不是未定义)。这就是为什么它会在您编辑和撤消时触发,但是不会在第一次加载时触发。
一种方法是在表单加载事件上使用空字符串初始化文本框的值。
但是我认为您可以通过使用必填字段验证器和自定义验证器来解决问题,这是更好的方法。

还是一样。尝试添加必填字段验证器,并在Page_Load中将值设置为String.Empty;,但仍然是一样的。除非先输入了内容,否则不会进行验证。 - Sam

2

您需要在服务器端的postback时调用

if (Page.IsValid)

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

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

ClientValidationFunction="YourValidationMethod"

然后该方法会执行类似以下操作:

function YourValidationMethod(source, args)
{

   if (valid) // do check here
     args.IsValid = true;
  else
     args.IsValid = false;
}

如果我回传,服务器端的代码可以正常工作。但是如果文本框从未输入过任何内容,则客户端的代码不会触发。 - Sam

2

啊,asp.net webforms 的乐趣 :)

如果您正在使用其他控件,例如自带jquery版本的radControls,那可能会出现问题,请确保使用框架附带的jquery版本,禁用他们自带的版本。

或者您可以在web.config中关闭非侵入式验证,看看是否在空白时触发。

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

使用框架版本。尝试过这个,没有什么不同。创建了一个新项目。添加了一个带有自定义验证器的文本框,但是除非已经输入了一些内容然后失去焦点,然后我才能删除文本并且它才会正确地触发。 - Sam

2

我已经测试了这段代码,并对客户端进行了随机验证,但验证没有正确触发。

我添加了非阻塞元素:

  1. On page load: (or however you want to activate it)

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms;
    }
    
  2. Make sure jquery is loaded:

关于 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"
        });
        }

在这两个更新后(我有一个提交按钮),它运作得很好。

因此,请检查您是否加载了无障碍验证并且您的jQuery已加载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接