我有一个正则表达式控件来验证电子邮件地址。它按预期验证,但它在控件失去焦点时执行。我希望它仅在提交表单时进行验证。
<asp:TextBox ID="txtRegisterEmailAddress" type="email" ValidationGroup="UserProfile" runat="server" CssClass="form-control " Style="text-transform: lowercase" />
<asp:RegularExpressionValidator ID="revRegisterEmailAddress" runat="server" ControlToValidate="txtRegisterEmailAddress" ErrorMessage="* Invalid Email Address" Display="Dynamic" SetFocusOnError="true" ValidateRequestMode="Disabled" ForeColor="Red" ValidationGroup="UserProfile" ValidationExpression="^(([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,10}(?:[a-z0-9-]*[a-z0-9])?)\s*?,?\s*?)+$" />
<asp:Button runat="server" ID="btnRegister" ClientIDMode="Static" ValidationGroup="UserProfile" CssClass="btn btn-default" OnClick="btnRegister_Click" Text="Register" OnClientClick="DisableReg();" UseSubmitBehavior="false" />
请帮忙。
修改
验证应该只在我提交时发生,如果验证失败则不应该提交。目前,它在失去控件焦点时进行验证。我不想重写验证过程,只是在验证时进行更改。
答案 0 :(得分:1)
您可以制作验证电子邮件的方法,这可能会返回一个bool:
public class RegexUtilities
{
bool invalid = false;
public bool IsValidEmail(string strIn)
{
invalid = false;
if (String.IsNullOrEmpty(strIn))
return false;
// Use IdnMapping class to convert Unicode domain names.
try
{
strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
RegexOptions.None, TimeSpan.FromMilliseconds(200));
}
catch (RegexMatchTimeoutException)
{
return false;
}
if (invalid)
return false;
// Return true if strIn is in valid e-mail format.
try
{
return Regex.IsMatch(strIn,
@"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
@"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
private string DomainMapper(Match match)
{
// IdnMapping class with default property values.
IdnMapping idn = new IdnMapping();
string domainName = match.Groups[2].Value;
try
{
domainName = idn.GetAscii(domainName);
}
catch (ArgumentException)
{
invalid = true;
}
return match.Groups[1].Value + domainName;
}
}
直接来自MSDN
然后在btnRegister_Click
中首先运行此方法并使用返回值来确定是否继续。
如果方法返回false
,您可以通过文本框或其他方式通知用户,然后通过返回来停止提交方法:
public void btnRegister_Click( ... )
{
var emailValidator = new RegexUtilities();
bool validEmail = emailValidator.IsValidEmail( ..textbox-input.. );
if (!validEmail)
{
txtError.Text = "Enter a valid email please";
return;
}
//...
//...
//(Your submit code)
}
编辑:更正了缺失的代码
答案 1 :(得分:1)
部分回答here
在init上,禁用所有不想被解雇的验证组&#34; onblur&#34;并使用ValidatorEnable进行onclick。
另一个选项是如果您希望用户移动到下一个表单元素但仍然显示表达式有问题,则关闭SetFocusOnError。表格无法提交,直到电子邮件地址更正为止
OP的更新: 在Page_Load上,验证将被禁用。但启用后,无法再次禁用它。我添加了以下代码,以便在文本框的onFocus上再次禁用它,以及它的特定文本框。
function TurnOffValidator(ControlToValidate) {
for (var i = 0; i < Page_Validators.length; i++) {
if (Page_Validators[i].controltovalidate === ControlToValidate) {
ValidatorEnable(Page_Validators[i], false);
}
}
}
function TurnOnValidator(ControlToValidate) {
for (var i = 0; i < Page_Validators.length; i++) {
if (Page_Validators[i].controltovalidate === ControlToValidate) {
ValidatorEnable(Page_Validators[i], true);
}
}
}
$('#<%= txtTextbox.ClientID %>').focus(function () {
TurnOffValidator("<%= txtTextbox.ClientID %>");
});