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