[英]Custom Validator not firing if control has not been filled in
我有一种感觉,这可能是一个非常简单的问题,但不能为我的生活弄明白。
我有一个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验证不会触发。 如果我然后输入内容。请保留该框。 返回然后清除验证工作框。 它回来说它是空的。
但是我希望它一进入方框就让它进行验证。 我不知道为什么验证器没有触发,如果文本框没有被触及。
将脚本放在webform中的任何位置,它将按您希望的方式工作:
document.addEventListener('DOMContentLoaded', function() {
[].forEach.call(document.querySelectorAll('input'), function(el, i) {
el.addEventListener('blur', ValidatorOnChange);
});
});
Validator不能以您想要的方式本地工作,因为它将onchange
事件处理程序附加到TextBoxes,因此,如果您根本不更改文本,则不会获得验证。
但是如果强制所有TextBox都触发相同的事件onblur
,那么,无论你是否更改了文本,它都会触发验证,这就是上面的脚本正在做的事情:将该事件处理程序添加到所有的TextBox中。页面,并在发生时调用ValidatorOnChange
函数。
注意:如果您已经在应用程序中的每个WebForm中调用了任何脚本,并且希望此行为在任何地方都可以使用,则可以将代码添加到该脚本中(在其中的任何位置),并且解决方案将传播到所有你的网络表格。
我已经使用随机客户端验证测试了该代码,并且验证没有正确启动。
我添加了无障碍元素:
在页面加载:(或者你想要激活它)
protected void Page_Load(object sender, EventArgs e) { Page.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms; }
确保加载了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。
你必须打电话
if(Page.IsValid)
在服务器上回发时,否则将不会调用您的服务器验证。 RequiredFieldValidator在客户端上验证,这就是为什么这个工作正常。 但是,您应该始终在服务器上进行验证。
对于客户端验证,您必须编写一个JavaScript方法。 您在CustomValidator中设置属性:
ClientValidationFunction = “YourValidationMethod”
并且该方法执行类似的操作
function YourValidationMethod(source, args)
{
if (valid) // do check here
args.IsValid = true;
else
args.IsValid = false;
}
我相信CustomValidators的设计旨在与RequiredFieldValidators分开操作,并且它们不会在空字段上触发是正常的。
啊,asp.net webforms的乐趣:)
如果您正在使用其他控件,例如随其自身版本的jquery一起提供的radControls,这可能是一个问题,请确保通过禁用它们来使用框架附带的控件。
或者,您可以在web.config中关闭不显眼的验证,看看是否在它为空时触发它。
<appSettings>
<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
根据msdn文档......我对validateEmptyText = true属性的理解是,即使textbox为空,它也会触发自定义验证(validateName javascipt函数)。
可能在第一个加载值未定义该文本框时,但是当您编辑和撤消它时,文本框的值现在将为空。(未定义)这就是为什么它在您编辑和撤消但不在第一次加载时触发的原因。
一种方法是在表单的加载事件上使用空字符串初始化文本框值
但我认为您可以通过使用必需的字段验证器和自定义验证器来解决您的问题,这是更好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.