C# 在表单提交时验证电子邮件

C# 在表单提交时验证电子邮件,c#,forms,validation,C#,Forms,Validation,我有一个验证电子邮件地址的正则表达式控件。它按预期进行验证,只是在控件失去焦点时进行验证。我希望它只在表单提交时生效 <asp:TextBox ID="txtRegisterEmailAddress" type="email" ValidationGroup="UserProfile" runat="server" CssClass="form-control " Style="text-transform: lowercase" /> <asp:RegularExpres

我有一个验证电子邮件地址的正则表达式控件。它按预期进行验证,只是在控件失去焦点时进行验证。我希望它只在表单提交时生效

<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" />

请帮忙

编辑:

验证只应在我提交时进行,如果验证失败,则不应提交。当前,它在失去控件焦点时进行验证。我不想重写验证过程,只想在验证时进行更改。

您可以创建一个验证电子邮件的方法,该方法可能会返回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;
        }
    }
编辑:已更正缺失代码

部分应答

在init上,禁用所有不希望被触发的ValidationGroup“onblur”,并将ValidationEnable用于onclick

另一个选项是,如果希望用户移动到下一个表单元素,但仍然显示表达式有问题,则关闭setFocusOneError。在更正电子邮件地址之前,无法提交表格

从OP更新: 在加载页面上,验证将被禁用。但启用后,无法再次禁用它。我已经添加了下面的代码来在文本框的焦点上再次禁用它,它是特定于文本框的

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 %>");
});
功能关闭验证程序(ControlToValidate){
对于(变量i=0;i
没有实用程序,这不是同一个问题。这完全不同。调用验证方法是
btnRegister\u单击
中的第一件事,这样可以确保只有通过验证后才会提交。提交后验证就完成了。请在这方面给我指导@Malte。RegularExpressionValidator有什么我需要的属性吗?这里回答-使用ValidatorEnable查看我的答案。这对你有帮助吗?我正试图修复你代码中的错误。。。大约
无效的
变量。它不存在于
DomainMapper
上下文中。请查看MSDN链接。它解释了代码。哦,我知道错误在哪里了
isvalid
是一个全局变量。我希望这回答了你的问题:)我同意@Krishna的解决方案。这很好,因为它都是客户端的。
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 %>");
});